From 4a72a9c718d8a0d76d1581bc44a5675a7bb317d9 Mon Sep 17 00:00:00 2001 From: cj201199 Date: Fri, 19 Jul 2024 20:32:48 +0530 Subject: [PATCH 01/21] guest user individual api intrgration done. --- lib/Common/api_urls.dart | 9 + .../EditProfile/View/ProfileTab.dart | 7 +- .../ProfileTab/Followers/Followers.dart | 735 +++++++--- .../ProfileTab/Following/Following.dart | 637 ++++++--- .../Business/ProfileTabBusGuest.dart | 813 ----------- .../Individual/ProfileTabIndGuest.dart | 1138 ---------------- .../Guest User/Model/GetGuestFollowers.dart | 82 ++ .../Guest User/Model/GetGuestFollowing.dart | 82 ++ .../Model/GuestGetProfileDataBus.dart | 179 +++ .../Model/GuestGetProfileDataIndi.dart | 296 ++++ .../View/Business/ProfileTabBusGuest.dart | 857 ++++++++++++ .../View/Individual/ProfileTabIndGuest.dart | 1204 +++++++++++++++++ .../Guest User/ViewModel/GuestProfileApi.dart | 73 + .../ProfileTab/My Network/MyNetwork.dart | 965 ++++++++----- lib/resources/routes/routes.dart | 4 +- 15 files changed, 4400 insertions(+), 2681 deletions(-) delete mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Business/ProfileTabBusGuest.dart delete mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Individual/ProfileTabIndGuest.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataBus.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Guest User/ViewModel/GuestProfileApi.dart diff --git a/lib/Common/api_urls.dart b/lib/Common/api_urls.dart index 057a17c..da20f1e 100644 --- a/lib/Common/api_urls.dart +++ b/lib/Common/api_urls.dart @@ -76,6 +76,15 @@ class ApiUrls { static const posteditprofilebusiness = "${baseUrl}update-business-profile"; static const geteditprofilebusiness = "${baseUrl}fetch-business-profile"; +//Guest + + static const getGuestProfileInd = "${baseUrl}get-guest-view-of-individual-user-profile"; + static const getGuestProfileBus = "${baseUrl}get-guest-view-of-business-user-profile"; + + + static const getGuestfollowers = "${baseUrl}get-guest-user-followers"; + static const getGuestfollowing = "${baseUrl}get-guest-user-following"; + } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index f313a88..4e6686a 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -1,6 +1,4 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_reaction_button/flutter_reaction_button.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -9,7 +7,6 @@ import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/controller/MainScreen.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; -import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; @@ -111,9 +108,7 @@ class _ProfileTabState extends State { accountTypeValue = prefs.getString('accountTypeValue'); accounTypeLogin = prefs.getString('accountTypefromLogin'); - if (getEditProfileIndi != null && - getEditProfileIndi!.data != null && - getEditProfileIndi!.data!.interest != null) { + if (getEditProfileIndi!.data!.interest != null) { // Join all interest names with a comma separator interestText = getEditProfileIndi!.data!.interest!.map((e) => e.name).join(', '); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart index 19fcb62..f6aa298 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart @@ -5,6 +5,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GetGuestFollowers.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followersModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; @@ -13,6 +15,7 @@ import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; class Followers extends StatefulWidget { @@ -24,6 +27,9 @@ class Followers extends StatefulWidget { class _FollowersState extends State { StreamController searchcontroller = StreamController(); + StreamController guestsearchcontroller = + StreamController(); + var guestUserid = Get.arguments['UpdataGuestIdfollowers'] ?? ''; @override void initState() { @@ -31,6 +37,11 @@ class _FollowersState extends State { var updata = ""; Profilegetmethod().getFollowers(updata, streamController: searchcontroller); + var guestupdata = ""; + + GuestProfileApi().getGuestfollowers(guestUserid, guestupdata, + streamController: guestsearchcontroller); + super.initState(); } @@ -116,15 +127,15 @@ class _FollowersState extends State { RemoveEmojiInputFormatter(), ], onInput: (value) { - Profilegetmethod().getFollowers(value, - streamController: searchcontroller); + GuestProfileApi().getGuestfollowers(guestUserid, value, + streamController: guestsearchcontroller); }, hintText: "Search people", ), ), sizedBoxHeight(25.h), - StreamBuilder( - stream: searchcontroller.stream, + StreamBuilder( + stream: guestsearchcontroller.stream, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data @@ -139,231 +150,226 @@ class _FollowersState extends State { ); } else { // Data has been loaded, show actual UI - return followersobj!.data!.isEmpty + return getguestfollowersobj!.data!.isEmpty ? _buildNoDataBody(context) - : - // ListView.builder( - // shrinkWrap: true, - // itemCount: followersobj!.data!.length, - // itemBuilder: (context, index) { - // return Column( - // children: [ - // followerWidget( - // imagePath: followersobj?.data?[index] - // .follower?.profilePhoto ?? - // "", - // // followersData[index]["imagePath"], - // title: followersobj?.data?[index].follower - // ?.fullName ?? - // "", - // // followersData[index]["title"], - // subtitle: followersobj?.data?[index] - // .follower?.userName ?? - // "", - // blockonTap: () { - // BlockUploadata(followersobj! - // .data![index].follower!.id); - // } - // // followersData[index]["subtitle"] - // ), - // if (index != followersobj!.data!.length - 1) - // commonDivider(), - // ], - // ); - // }, - // ); - - ListView.separated( + : ListView.separated( physics: ScrollPhysics(), shrinkWrap: true, - itemCount: followersobj!.data!.length, + itemCount: getguestfollowersobj!.data!.length, separatorBuilder: (BuildContext context, int index) { return commonDivider(); }, itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followersobj!.data![index].follower! - .profilePhoto == - null || - followersobj! - .data![index] - .follower! - .profilePhoto! - .isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followersobj! - .data![index] - .follower! - .profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followersobj!.data![index].follower! - .fullName == - null || - followersobj! - .data![index] - .follower! - .fullName! - .isEmpty == - true - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC( - followersobj!.data![index] - .follower!.fullName!), - sizedBoxHeight(4.h), - followersobj!.data![index].follower! - .userName == - null || - followersobj! - .data![index] - .follower! - .userName! - .isEmpty == - true - ? text12w400_FCFCFC_blur( - "regroup") - : text12w400_FCFCFC_blur( - followersobj!.data![index] - .follower!.userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor( - width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext - context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async { - setState(() { - removeid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower! - .id == - removeid); - RemoveUploadata(); - }); - }, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async { - setState(() { - blockid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower! - .id == - blockid); - BlockUploadata(); - }); - }, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, + return GestureDetector( + onTap: () { + Get.toNamed(RouteName.profiletabindguest, + arguments: { + "FolloweridIndex": getguestfollowersobj! + .data![index].iamPrincipalXid, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + getguestfollowersobj! + .data![index] + .follower! + .profilePhoto == + null || + getguestfollowersobj! + .data![index] + .follower! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + getguestfollowersobj! + .data![index] + .follower! + .profilePhoto!), + radius: 25.r, ), - ), - )), - ], - ), - ) - ], + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + getguestfollowersobj! + .data![index] + .follower! + .fullName == + null || + getguestfollowersobj! + .data![index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC( + getguestfollowersobj! + .data![index] + .follower! + .fullName!), + sizedBoxHeight(4.h), + getguestfollowersobj! + .data![index] + .follower! + .userName == + null || + getguestfollowersobj! + .data![index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + getguestfollowersobj! + .data![index] + .follower! + .userName!) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: + Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: () async { + setState(() { + removeid = getguestfollowersobj! + .data![ + index] + .follower! + .id ?? + 0; + getguestfollowersobj! + .data! + .removeWhere((item) => + item.follower! + .id == + removeid); + RemoveUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Remove user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_delete-28-regular.png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-regular.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () async { + setState(() { + blockid = getguestfollowersobj! + .data![ + index] + .follower! + .id ?? + 0; + getguestfollowersobj! + .data! + .removeWhere((item) => + item.follower! + .id == + blockid); + BlockUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Block user"), + Spacer(), + Image.asset( + "assets/images/png/blockchat.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ) + ], + ), ); }, ); @@ -373,13 +379,298 @@ class _FollowersState extends State { ]) ])) ])); + + // Stack(children: [ + // Container( + // decoration: const BoxDecoration( + // image: DecorationImage( + // image: AssetImage("assets/images/png/Ellipse 1496.png"), + // fit: BoxFit.fill)), + // ), + // SingleChildScrollView( + // child: Column(children: [ + // Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.w), + // child: CustomTextFormField( + // leadingIcon: SizedBox( + // height: 23, + // width: 23, + // child: Center( + // child: Image.asset( + // "assets/images/png/ion_search-outline.png", + // height: 23, + // width: 23, + // ), + // ), + // ), + // texttype: TextInputType.text, + // inputFormatters: [ + // RemoveEmojiInputFormatter(), + // ], + // onInput: (value) { + // Profilegetmethod().getFollowers(value, + // streamController: searchcontroller); + // }, + // hintText: "Search people", + // ), + // ), + // sizedBoxHeight(25.h), + // StreamBuilder( + // stream: searchcontroller.stream, + // builder: (ctx, snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // // Display shimmer effect while waiting for data + // return Center(child: CircularProgressIndicator()); + // } else if (snapshot.hasError) { + // // Handle error state + // return Center( + // child: Text( + // '${snapshot.error} occurred', + // style: TextStyle(fontSize: 18), + // ), + // ); + // } else { + // // Data has been loaded, show actual UI + // return followersobj!.data!.isEmpty + // ? _buildNoDataBody(context) + // : + // // ListView.builder( + // // shrinkWrap: true, + // // itemCount: followersobj!.data!.length, + // // itemBuilder: (context, index) { + // // return Column( + // // children: [ + // // followerWidget( + // // imagePath: followersobj?.data?[index] + // // .follower?.profilePhoto ?? + // // "", + // // // followersData[index]["imagePath"], + // // title: followersobj?.data?[index].follower + // // ?.fullName ?? + // // "", + // // // followersData[index]["title"], + // // subtitle: followersobj?.data?[index] + // // .follower?.userName ?? + // // "", + // // blockonTap: () { + // // BlockUploadata(followersobj! + // // .data![index].follower!.id); + // // } + // // // followersData[index]["subtitle"] + // // ), + // // if (index != followersobj!.data!.length - 1) + // // commonDivider(), + // // ], + // // ); + // // }, + // // ); + + // ListView.separated( + // physics: ScrollPhysics(), + // shrinkWrap: true, + // itemCount: followersobj!.data!.length, + // separatorBuilder: + // (BuildContext context, int index) { + // return commonDivider(); + // }, + // itemBuilder: (context, index) { + // return Column( + // children: [ + // Padding( + // padding: EdgeInsets.symmetric( + // vertical: 16.h, horizontal: 16.w), + // child: Row( + // children: [ + // followersobj!.data![index].follower! + // .profilePhoto == + // null || + // followersobj! + // .data![index] + // .follower! + // .profilePhoto! + // .isEmpty + // ? CircleAvatar( + // backgroundImage: AssetImage( + // 'assets/images/png/Ellipse 43.png'), + // radius: 25.r, + // ) + // : CircleAvatar( + // backgroundImage: NetworkImage( + // followersobj! + // .data![index] + // .follower! + // .profilePhoto!), + // radius: 25.r, + // ), + // sizedBoxWidth(10.w), + // Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // children: [ + // followersobj!.data![index].follower! + // .fullName == + // null || + // followersobj! + // .data![index] + // .follower! + // .fullName! + // .isEmpty == + // true + // ? text16w400_FCFCFC("Regroup") + // : text16w400_FCFCFC( + // followersobj!.data![index] + // .follower!.fullName!), + // sizedBoxHeight(4.h), + // followersobj!.data![index].follower! + // .userName == + // null || + // followersobj! + // .data![index] + // .follower! + // .userName! + // .isEmpty == + // true + // ? text12w400_FCFCFC_blur( + // "regroup") + // : text12w400_FCFCFC_blur( + // followersobj!.data![index] + // .follower!.userName!) + // ], + // ), + // Spacer(), + // PopupMenuButton( + // surfaceTintColor: Color(0xFF222935), + // constraints: + // BoxConstraints.tightFor( + // width: 176.w), + // offset: Offset(0, 20), + // color: Color(0xFF222935), + // tooltip: "", + // itemBuilder: (BuildContext + // context) => + // [ + // PopupMenuItem( + // // onTap: () {}, + // onTap: () async { + // setState(() { + // removeid = followersobj! + // .data![index] + // .follower! + // .id ?? + // 0; + // followersobj!.data! + // .removeWhere((item) => + // item.follower! + // .id == + // removeid); + // RemoveUploadata(); + // }); + // }, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Remove user"), + // Spacer(), + // Image.asset( + // "assets/images/png/fluent_delete-28-regular.png", + // height: 15.h, + // width: 15.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Message user"), + // Spacer(), + // Image.asset( + // "assets/images/png/fluent_chat-20-regular.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () async { + // setState(() { + // blockid = followersobj! + // .data![index] + // .follower! + // .id ?? + // 0; + // followersobj!.data! + // .removeWhere((item) => + // item.follower! + // .id == + // blockid); + // BlockUploadata(); + // }); + // }, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Block user"), + // Spacer(), + // Image.asset( + // "assets/images/png/blockchat.png", + // height: 25.h, + // width: 25.w, + // ) + // ], + // ), + // ), + // ), + // ], + // child: Container( + // height: 20, + // width: 20, + // child: Center( + // child: Image.asset( + // "assets/images/png/Group 1000004071.png", + // height: 22.h, + // width: 4.w, + // ), + // ), + // )), + // ], + // ), + // ) + // ], + // ); + // }, + // ); + // } + // }, + // ), + // ]) + // ])) + // ])); } Widget _buildNoDataBody(context) { return Center( child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "No Data Found", diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart index ea23321..65e921f 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart @@ -5,6 +5,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GetGuestFollowers.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GetGuestFollowing.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followingModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; @@ -13,6 +16,7 @@ import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; class Following extends StatefulWidget { @@ -24,13 +28,21 @@ class Following extends StatefulWidget { class _FollowingState extends State { StreamController searchcontroller = StreamController(); + StreamController guestsearchcontroller = + StreamController(); + var guestUserid = Get.arguments['UpdataGuestIdfollowing'] ?? ''; @override void initState() { // TODO: implement initState var updata = ""; Profilegetmethod().getFollowing(updata, streamController: searchcontroller); + var guestupdata = ""; + + GuestProfileApi().getGuestfollowing(guestUserid, guestupdata, + streamController: guestsearchcontroller); + super.initState(); } @@ -66,14 +78,15 @@ class _FollowingState extends State { @override Widget build(BuildContext context) { return Scaffold( - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - resizeToAvoidBottomInset: false, - appBar: CommonAppbar( - titleTxt: "Following", - ), - body: Stack(children: [ + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + resizeToAvoidBottomInset: false, + appBar: CommonAppbar( + titleTxt: "Following", + ), + body: Stack( + children: [ Container( decoration: const BoxDecoration( image: DecorationImage( @@ -104,17 +117,14 @@ class _FollowingState extends State { RemoveEmojiInputFormatter(), ], onInput: (value) { - // Onboard().postGroupsearch({"search": value}, - // streamController: searchcontroller); - // searchGroups(value!); - Profilegetmethod().getFollowing(value, - streamController: searchcontroller); + GuestProfileApi().getGuestfollowing(guestUserid, value, + streamController: guestsearchcontroller); }, ), ), sizedBoxHeight(25.h), - StreamBuilder( - stream: searchcontroller.stream, + StreamBuilder( + stream: guestsearchcontroller.stream, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data @@ -129,189 +139,187 @@ class _FollowingState extends State { ); } else { // Data has been loaded, show actual UI - return followingobj!.data!.isEmpty + return getguestfollowingobj!.data!.isEmpty ? _buildNoDataBody(context) : ListView.separated( physics: ScrollPhysics(), shrinkWrap: true, - itemCount: followingobj!.data!.length, + itemCount: getguestfollowingobj!.data!.length, separatorBuilder: (BuildContext context, int index) { return commonDivider(); }, itemBuilder: (context, index) { - return - // Column( - // children: [ - // Followinglist( - // imagePath: followingobj?.data?[index] - // .following?.profilePhoto ?? - // '', - // title: followingobj! - // .data?[index].following?.fullName ?? - // '', - // subtitle: followingobj! - // .data?[index].following?.userName ?? - // '', - // unfollowontap: (id) => Uploadata(id), - // unfollowindex: followingobj! - // .data![index].following!.id!, - // ), - // if (index != followingobj!.data!.length - 1) - // commonDivider(), - // ], - // ); - Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followingobj!.data![index].following! - .profilePhoto == - null || - followingobj! - .data![index] - .following! - .profilePhoto! - .isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followingobj! - .data![index] - .following! - .profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followingobj! - .data![index] - .following! - .fullName == - null || - followingobj! - .data![index] - .following! - .fullName! - .isEmpty - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC( - followingobj!.data![index] - .following!.fullName!), - sizedBoxHeight(4.h), - followingobj! - .data![index] - .following! - .userName == - null || - followingobj! - .data![index] - .following! - .userName! - .isEmpty - ? text12w400_FCFCFC_blur( - "regroup") - : text12w400_FCFCFC_blur( - followingobj!.data![index] - .following!.userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor( - width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext - context) => - [ - PopupMenuItem( - onTap: () async { - setState(() { - unfollowid = - followingobj! - .data![ - index] - .following! - .id ?? - 0; - // followingobj!.data!.removeAt(index); - followingobj!.data! - .removeWhere((item) => - item.following! - .id == - unfollowid); - Uploadata(); - }); - }, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Unfollow user"), - Spacer(), - Image.asset( - "assets/images/png/Black1323e.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-22.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, + return GestureDetector( + onTap: () { + Get.toNamed(RouteName.profiletabindguest, + arguments: { + "FollowingidIndex": + getguestfollowingobj!.data![index] + .followingIamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + getguestfollowingobj! + .data![index] + .following! + .profilePhoto == + null || + getguestfollowingobj! + .data![index] + .following! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + getguestfollowingobj! + .data![index] + .following! + .profilePhoto!), + radius: 25.r, ), - ), - )), - ], + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + getguestfollowingobj! + .data![index] + .following! + .fullName == + null || + getguestfollowingobj! + .data![index] + .following! + .fullName! + .isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC( + getguestfollowingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + getguestfollowingobj! + .data![index] + .following! + .userName == + null || + getguestfollowingobj! + .data![index] + .following! + .userName! + .isEmpty + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + getguestfollowingobj! + .data![index] + .following! + .userName!) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: + Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext context) => + [ + PopupMenuItem( + onTap: () async { + setState(() { + unfollowid = getguestfollowingobj! + .data![ + index] + .following! + .id ?? + 0; + // followingobj!.data!.removeAt(index); + getguestfollowingobj! + .data! + .removeWhere((item) => + item.following! + .id == + unfollowid); + Uploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Unfollow user"), + Spacer(), + Image.asset( + "assets/images/png/Black1323e.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-22.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), ), - ), - ], + ], + ), ); }, ); @@ -320,7 +328,260 @@ class _FollowingState extends State { ), ]) ])) - ])); + ], + ), + + // Stack( + // children: [ + // Container( + // decoration: const BoxDecoration( + // image: DecorationImage( + // image: AssetImage("assets/images/png/Ellipse 1496.png"), + // fit: BoxFit.fill)), + // ), + // SingleChildScrollView( + // child: Column(children: [ + // Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.w), + // child: CustomTextFormField( + // leadingIcon: SizedBox( + // height: 23, + // width: 23, + // child: Center( + // child: Image.asset( + // "assets/images/png/ion_search-outline.png", + // height: 23, + // width: 23, + // ), + // ), + // ), + // hintText: "Search people", + // texttype: TextInputType.text, + // inputFormatters: [ + // // LengthLimitingTextInputFormatter(20), + // RemoveEmojiInputFormatter(), + // ], + // onInput: (value) { + // // Onboard().postGroupsearch({"search": value}, + // // streamController: searchcontroller); + // // searchGroups(value!); + // Profilegetmethod().getFollowing(value, + // streamController: searchcontroller); + // }, + // ), + // ), + // sizedBoxHeight(25.h), + // StreamBuilder( + // stream: searchcontroller.stream, + // builder: (ctx, snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // // Display shimmer effect while waiting for data + // return Center(child: CircularProgressIndicator()); + // } else if (snapshot.hasError) { + // // Handle error state + // return Center( + // child: Text( + // '${snapshot.error} occurred', + // style: TextStyle(fontSize: 18), + // ), + // ); + // } else { + // // Data has been loaded, show actual UI + // return followingobj!.data!.isEmpty + // ? _buildNoDataBody(context) + // : ListView.separated( + // physics: ScrollPhysics(), + // shrinkWrap: true, + // itemCount: followingobj!.data!.length, + // separatorBuilder: + // (BuildContext context, int index) { + // return commonDivider(); + // }, + // itemBuilder: (context, index) { + // return + // // Column( + // // children: [ + // // Followinglist( + // // imagePath: followingobj?.data?[index] + // // .following?.profilePhoto ?? + // // '', + // // title: followingobj! + // // .data?[index].following?.fullName ?? + // // '', + // // subtitle: followingobj! + // // .data?[index].following?.userName ?? + // // '', + // // unfollowontap: (id) => Uploadata(id), + // // unfollowindex: followingobj! + // // .data![index].following!.id!, + // // ), + // // if (index != followingobj!.data!.length - 1) + // // commonDivider(), + // // ], + // // ); + // Column( + // children: [ + // Padding( + // padding: EdgeInsets.symmetric( + // vertical: 16.h, horizontal: 16.w), + // child: Row( + // children: [ + // followingobj!.data![index].following! + // .profilePhoto == + // null || + // followingobj! + // .data![index] + // .following! + // .profilePhoto! + // .isEmpty + // ? CircleAvatar( + // backgroundImage: AssetImage( + // 'assets/images/png/Ellipse 43.png'), + // radius: 25.r, + // ) + // : CircleAvatar( + // backgroundImage: NetworkImage( + // followingobj! + // .data![index] + // .following! + // .profilePhoto!), + // radius: 25.r, + // ), + // sizedBoxWidth(10.w), + // Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // children: [ + // followingobj! + // .data![index] + // .following! + // .fullName == + // null || + // followingobj! + // .data![index] + // .following! + // .fullName! + // .isEmpty + // ? text16w400_FCFCFC("Regroup") + // : text16w400_FCFCFC( + // followingobj!.data![index] + // .following!.fullName!), + // sizedBoxHeight(4.h), + // followingobj! + // .data![index] + // .following! + // .userName == + // null || + // followingobj! + // .data![index] + // .following! + // .userName! + // .isEmpty + // ? text12w400_FCFCFC_blur( + // "regroup") + // : text12w400_FCFCFC_blur( + // followingobj!.data![index] + // .following!.userName!) + // ], + // ), + // Spacer(), + // PopupMenuButton( + // surfaceTintColor: Color(0xFF222935), + // constraints: + // BoxConstraints.tightFor( + // width: 176.w), + // offset: Offset(0, 20), + // color: Color(0xFF222935), + // tooltip: "", + // itemBuilder: (BuildContext + // context) => + // [ + // PopupMenuItem( + // onTap: () async { + // setState(() { + // unfollowid = + // followingobj! + // .data![ + // index] + // .following! + // .id ?? + // 0; + // // followingobj!.data!.removeAt(index); + // followingobj!.data! + // .removeWhere((item) => + // item.following! + // .id == + // unfollowid); + // Uploadata(); + // }); + // }, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Unfollow user"), + // Spacer(), + // Image.asset( + // "assets/images/png/Black1323e.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Message user"), + // Spacer(), + // Image.asset( + // "assets/images/png/fluent_chat-20-22.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // ], + // child: Container( + // height: 20, + // width: 20, + // child: Center( + // child: Image.asset( + // "assets/images/png/Group 1000004071.png", + // height: 22.h, + // width: 4.w, + // ), + // ), + // )), + // ], + // ), + // ), + // ], + // ); + // }, + // ); + // } + // }, + // ), + // ]) + // ])) + // ], + // ), + ); } Widget _buildNoDataBody(context) { diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Business/ProfileTabBusGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Business/ProfileTabBusGuest.dart deleted file mode 100644 index efda704..0000000 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Business/ProfileTabBusGuest.dart +++ /dev/null @@ -1,813 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_reaction_button/flutter_reaction_button.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:regroup/Common/CommonGlassmorphism.dart'; -import 'package:regroup/Common/CommonWidget.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; -import 'package:regroup/Utils/Common/sized_box.dart'; -import 'package:regroup/Utils/texts.dart'; -import 'package:regroup/resources/routes/route_name.dart'; - -class profiletabBusGest extends StatefulWidget { - const profiletabBusGest({super.key}); - - @override - State createState() => _profiletabBusGestState(); -} - -class _profiletabBusGestState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - // accountTypeValue == '1' || - body: - // FutureBuilder( - // future: businessfuture, - // builder: (ctx, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return Center( - // child: CircularProgressIndicator( - // color: Colors.blue, - // ), - // ); - // } - - // if (snapshot.hasError) { - // return Center( - // child: Text( - // '${snapshot.error} occurred', - // style: TextStyle(fontSize: 18.spMin), - // ), - // ); - // } - - // if (snapshot.connectionState == ConnectionState.done && - // snapshot.hasData) { - // print("Data fetched-->"); - // return - - Stack(clipBehavior: Clip.none, children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - SafeArea( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - height: 484.h, - width: double.infinity, - child: Image.asset( - "assets/images/png/Rectangle 49 (1).png", - fit: BoxFit.cover, - ), - ), - Positioned.fill( - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Color.fromRGBO(34, 41, 53, 0.1), - Color.fromRGBO(34, 41, 53, 0.79), - ], - stops: [ - 0.5788, - 0.8, - ], - ), - ), - ), - ), - Positioned( - bottom: 0, - right: 0, - left: 0, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Column( - children: [ - text20700white( - "Victory gear sports emporium"), - sizedBoxHeight(5.h), - text18w400white("@Victorygames_10"), - sizedBoxHeight(15.h), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () { - Get.toNamed(RouteName.followers); - }, - child: Column( - children: [ - text16400white("254"), - sizedBoxHeight(6.h), - text12400whiteblur("Followers") - ], - ), - ), - sizedBoxWidth(20.w), - Container( - height: 58.h, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.white, - width: 1.0, - ), - boxShadow: [ - BoxShadow( - color: Color(0x66000000), - offset: Offset(0, 4), - blurRadius: 4.0, - ), - ], - ), - ), - sizedBoxWidth(20.w), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.following); - }, - child: Column( - children: [ - text16400white("344"), - sizedBoxHeight(6.h), - text12400whiteblur("Following") - ], - ), - ), - ], - ), - sizedBoxHeight(20.h), - ], - ), - ], - ), - ), - ), - ], - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - sizedBoxHeight(30.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.toNamed(RouteName.buseditprofile); - }, - child: Container( - height: 40.h, - width: 170.w, - decoration: BoxDecoration( - color: Color(0xFFD90B2E), - borderRadius: BorderRadius.circular(30.r), - ), - child: - Center(child: text16w400_FCFCFC("Follow")), - ), - ), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.shareProfile); - }, - child: commonGlassUI( - width: 170.w, - height: 40.h, - - opacity1: 0.05, - opacity2: 0.07, - borderRadius: BorderRadius.circular(30.r), - mainOpacity: 1, - customWidget: Center( - child: text16w400_FCFCFC("Message"), - ), - // border: 1, - ), - ) - ], - ), - sizedBoxHeight(30.h), - text18w700white("About"), - sizedBoxHeight(10.h), - text14400white( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), - sizedBoxHeight(25.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/Frame 24.png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - text14400whiteblur("James Bothman"), - ], - ), - sizedBoxHeight(20.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/Vector2a.png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - text14400whiteblur("www.exampledummywebsite.com"), - ], - ), - sizedBoxHeight(20.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/Group 58645.png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - text14400whiteblur( - "Elm street london, United Kingdom"), - ], - ), - sizedBoxHeight(20.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/calender.png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - // text14400whiteblur(getEditProfileIndi! - // .data!.interest! - // .join(', ')), - text14400whiteblur("Founded at : 2010"), - ], - ), - sizedBoxHeight(30.h), - ], - ), - ), - sizedBoxHeight(30.h), - Padding( - padding: EdgeInsets.only(left: 16.w), - child: text18w700white("Posts"), - ), - normalcardtile( - profileImg: 'assets/images/png/Ellipse 48.png', - title: 'Jocelyn Dokidis', - mainImg: 'assets/images/png/Rectangle 46.png', - containerTitle: [ - 'Race', - 'Swimming', - 'Events', - 'Marathon', - 'Events' - ]), - sizedBoxHeight(120.h), - ], - ), - ), - ), - Positioned.fill( - top: 40.h, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - children: [ - sizedBoxHeight(20.h), - Row( - children: [ - Spacer(), - commonContainer( - width: 40.w, - height: 40.h, - borderwidth: 0.5, - boxShape: BoxShape.circle, - opacity1: 0.5, - opacity2: 0.6, - customWidget: PopupMenuButton( - surfaceTintColor: const Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 200.w), - offset: const Offset(0, 50), - color: const Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () { - Get.toNamed(RouteName.shareProfile); - }, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Share profile', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/share.png", - height: 17.h, - width: 17.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Report user', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/Vector (5).png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Block user', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/blocked.png", - height: 18.h, - width: 18.w, - ) - ], - ), - ), - ), - ], - child: Center( - child: Image.asset( - 'assets/images/png/Group 1000004071.png', - height: 20.h, - width: 20.w, - )), - ), - ), - ], - ), - ], - ), - ), - ), - ])); - } -} - -Widget normalcardtile({ - required String profileImg, - required String title, - required String mainImg, - required List containerTitle, -}) { - var mainImage = 'assets/images/png/uiw_like-o.png'.obs; - void updateImage(String reaction) { - if (reaction == 'like') { - mainImage.value = 'assets/images/png/f7_hand-thumbsup.png'; - } else if (reaction == 'heart') { - mainImage.value = 'assets/images/png/heart 2.png'; - } else if (reaction == 'party') { - mainImage.value = 'assets/images/png/party-popper 2.png'; - } - } - - return Column( - children: [ - sizedBoxHeight(25.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - foregroundImage: AssetImage(profileImg), - radius: 25.r, - ), - sizedBoxWidth(12.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16w400_FCFCFC(title), - sizedBoxHeight(5.h), - Row( - children: [ - Image.asset( - 'assets/images/png/community 1 (traced).png', - height: 14.w, - width: 14.w, - ), - sizedBoxWidth(7.w), - text12w400_FCFCFC('Active alliance network'), - sizedBoxWidth(7.w), - Icon( - Icons.circle, - color: Color(0xFFFCFCFC), - size: 4.sp, - ), - sizedBoxWidth(6.w), - text12w400_FCFCFC('1 Hour ago'), - ], - ) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 50), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => [ - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Report Post', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/Vector (5).png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Share post', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/share.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Pin', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/f7_pin-fill (2).png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Image.asset( - 'assets/images/png/Group 1000004071.png', - width: 16.w, - height: 18.h, - ), - ), - sizedBoxWidth(5.w) - ], - ), - ), - sizedBoxHeight(20.h), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.postdetailsScreen); - }, - child: Container( - height: 163.h, - width: double.infinity, - child: Image.asset( - mainImg, - fit: BoxFit.cover, - ), - )), - sizedBoxHeight(20.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column(children: [ - SizedBox( - height: 30.h, - child: ListView.builder( - scrollDirection: Axis.horizontal, - shrinkWrap: true, - itemCount: containerTitle.length, - itemBuilder: (context, index) { - return Padding( - padding: EdgeInsets.only(right: 12.w), - child: GestureDetector( - onTap: () { - // Get.toNamed(RouteName.cyclescreen); - }, - child: containertile(text: containerTitle[index])), - ); - }, - ), - ), - sizedBoxHeight(20.h), - text16w400_FCFCFC( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s . . ."), - Row(children: [ - stackReaction(number: '20', containerImages: [ - 'assets/images/png/f7_hand-thumbsup.png', - 'assets/images/png/heart 2.png', - 'assets/images/png/party-popper 2.png' - ]), - Spacer(), - commonContainer( - width: 30.w, - height: 30.h, - opacity1: 0.2, - opacity2: 0.2, - borderwidth: 0.43, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - 'assets/images/png/Frame 1000004088.png', - height: 13.h, - width: 13.w, - ), - ), - ), - sizedBoxWidth(12.w), - text14w400_FCFCFC('20'), - sizedBoxWidth(20.w), - commonContainer( - width: 30.w, - height: 30.h, - opacity1: 0.2, - opacity2: 0.2, - borderwidth: 0.43, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - 'assets/images/png/Vector (1).png', - height: 12.h, - width: 12.w, - ), - ), - ), - sizedBoxWidth(12.w), - text14w400_FCFCFC('10'), - ]), - sizedBoxHeight(30.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Obx(() { - return ReactionButton( - onReactionChanged: (reaction) { - updateImage(reaction?.value ?? 'like'); - debugPrint('Selected value: ${reaction?.value}'); - }, - reactions: ?>[ - Reaction( - value: 'like', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - icon: _buildReactionsIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - ), - Reaction( - value: 'heart', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/heart 2.png'), - icon: _buildReactionsIcon( - 'assets/images/png/heart 2.png'), - ), - Reaction( - value: 'party', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/party-popper 2.png'), - icon: _buildReactionsIcon( - 'assets/images/png/party-popper 2.png'), - ), - ], - selectedReaction: Reaction( - value: 'like', - icon: _buildReactionsIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - ), - boxColor: Colors.white, - boxElevation: 9, - boxRadius: 30, - itemsSpacing: 8, - itemScale: 0.4, - itemSize: Size(45, 45), - boxPadding: EdgeInsets.all(8), - boxAnimationDuration: Duration(milliseconds: 200), - itemAnimationDuration: Duration(milliseconds: 500), - hoverDuration: Duration(milliseconds: 700), - // toggle: false, - - child: _buildReactionsIcon(mainImage.value), - ); - }) - ], - ), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.postdetailsScreen); - }, - child: Column( - children: [ - Image.asset( - 'assets/images/png/Frame 1000004088.png', - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Comment') - ], - ), - ), - Column( - children: [ - Image.asset( - 'assets/images/png/Frame 1000004089.png', - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Save') - ], - ) - ], - ) - ]), - ), - ], - ); -} - -Widget _buildReactionsPreviewIcon(String assetPath) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - assetPath, - height: 40.h, - width: 40.w, - ), - ); -} - -Widget _buildReactionsIcon(String assetPath) { - return Column( - children: [ - Image.asset( - assetPath, - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Like') - ], - ); -} - -Widget containertile({required String text}) { - return commonContainer( - width: 100.w, - height: 30.h, - borderRadius: BorderRadius.circular(30.r), - borderColor: Color(0xFFD90B2E), - borderwidth: 0.9, - customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.w), - child: Center(child: text14w400_FCFCFC(text)), - )); -} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Individual/ProfileTabIndGuest.dart deleted file mode 100644 index 77a0c58..0000000 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Individual/ProfileTabIndGuest.dart +++ /dev/null @@ -1,1138 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_reaction_button/flutter_reaction_button.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:get/get.dart'; -import 'package:regroup/Common/CommonGlassmorphism.dart'; -import 'package:regroup/Common/CommonWidget.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; -import 'package:regroup/Utils/Common/sized_box.dart'; -import 'package:regroup/Utils/texts.dart'; -import 'package:regroup/resources/routes/route_name.dart'; - -class ProfileTabIndGuest extends StatefulWidget { - const ProfileTabIndGuest({super.key}); - - @override - State createState() => _ProfileTabIndGuestState(); -} - -class _ProfileTabIndGuestState extends State { - List cardtile = [ - { - "imagePath": "assets/images/png/Rectangle 29ss.png", - "title": "Cardio crusaders circle" - }, - { - "imagePath": "assets/images/png/Rectangle 31ee.png", - "title": "Strength squad syndicate" - }, - { - "imagePath": "assets/images/png/Rectangle 30aa.png", - "title": "Flexibility faction force" - }, - { - "imagePath": "assets/images/png/Rectangle 29ss.png", - "title": "Cardio crusaders circle" - }, - ]; - - List timeline = [ - { - "imagePath": "assets/images/png/cimg1.png", - "title": "Cardio crusaders circle" - }, - { - "imagePath": "assets/images/png/cimg1.png", - "title": "Cardio crusaders circle" - }, - { - "imagePath": "assets/images/png/cimg1.png", - "title": "Cardio crusaders circle" - }, - { - "imagePath": "assets/images/png/cimg1.png", - "title": "Cardio crusaders circle" - }, - ]; - - List certificationData = [ - { - "imagePath": "assets/images/png/image 17.png", - "title": "Professional sports management", - "subtitle": "Athlete 365 ", - "date": "Issued Feb 2024" - }, - { - "imagePath": "assets/images/png/image 18.png", - "title": "Professional sports management", - "subtitle": "Athlete 365 ", - "date": "Issued Feb 2024" - }, - { - "imagePath": "assets/images/png/image 19.png", - "title": "Professional sports management", - "subtitle": "Athlete 365 ", - "date": "Issued Feb 2024" - }, - ]; - @override - Widget build(BuildContext context) { - return Scaffold( - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - // accountTypeValue == '1' || - body: - // accounTypeLogin == '1' || accountTypeValue == '1' - // ? FutureBuilder( - // future: individualfuture, - // builder: (ctx, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return Center( - // child: CircularProgressIndicator( - // color: Colors.blue, - // ), - // ); - // } - - // if (snapshot.hasError) { - // return Center( - // child: Text( - // '${snapshot.error} occurred', - // style: TextStyle(fontSize: 18.spMin), - // ), - // ); - // } - - // if (snapshot.connectionState == ConnectionState.done && - // snapshot.hasData) { - // print("Data fetched-->"); - // return - Stack(clipBehavior: Clip.none, children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - SafeArea( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Stack( - children: [ - Container( - height: 484.h, - width: double.infinity, - child: Image.asset( - "assets/images/png/profileimg.png", - fit: BoxFit.cover, - ), - ), - Positioned.fill( - child: Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - Color.fromRGBO(34, 41, 53, 0.1), - Color.fromRGBO(34, 41, 53, 0.79), - ], - stops: [ - 0.5788, - 0.8, - ], - ), - ), - ), - ), - Positioned( - bottom: 0, - right: 0, - left: 0, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Column( - children: [ - text20700white("Edward Hackett"), - sizedBoxHeight(5.h), - text18w400white("@edward_01"), - sizedBoxHeight(15.h), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () { - Get.toNamed(RouteName.followers); - }, - child: Column( - children: [ - text16400white("254"), - sizedBoxHeight(6.h), - text12400whiteblur("Followers") - ], - ), - ), - sizedBoxWidth(20.w), - Container( - height: 58.h, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.white, - width: 1.0, - ), - boxShadow: [ - BoxShadow( - color: Color(0x66000000), - offset: Offset(0, 4), - blurRadius: 4.0, - ), - ], - ), - ), - sizedBoxWidth(20.w), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.following); - }, - child: Column( - children: [ - text16400white("254"), - sizedBoxHeight(6.h), - text12400whiteblur("Following") - ], - ), - ), - sizedBoxWidth(20.w), - Container( - height: 58.h, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.white, - width: 1.0, - ), - boxShadow: [ - BoxShadow( - color: Color(0x66000000), - offset: Offset(0, 4), - blurRadius: 4.0, - ), - ], - ), - ), - sizedBoxWidth(20.w), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.clubs); - }, - child: Column( - children: [ - text16400white("10"), - sizedBoxHeight(6.h), - text12400whiteblur("Clubs") - ], - ), - ), - ], - ), - sizedBoxHeight(20.h), - ], - ), - ], - ), - ), - ), - ], - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - sizedBoxHeight(30.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - onTap: () { - Get.toNamed(RouteName.editProfile); - }, - child: Container( - height: 40.h, - width: 170.w, - decoration: BoxDecoration( - color: Color(0xFFD90B2E), - borderRadius: BorderRadius.circular(30.r), - ), - child: Center(child: text16w400_FCFCFC("Follow")), - ), - ), - GestureDetector( - onTap: () { - // Get.toNamed(RouteName.shareProfile); - }, - child: commonGlassUI( - width: 170.w, - height: 40.h, - - opacity1: 0.05, - opacity2: 0.07, - borderRadius: BorderRadius.circular(30.r), - mainOpacity: 1, - customWidget: Center( - child: text16w400_FCFCFC("Message"), - ), - // border: 1, - ), - ) - ], - ), - sizedBoxHeight(30.h), - text18w700white("About"), - sizedBoxHeight(10.h), - text14400white( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), - sizedBoxHeight(25.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/Group 58645.png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - text14400whiteblur( - "Elm street london, United Kingdom"), - ], - ), - sizedBoxHeight(20.h), - Row( - children: [ - commonContainer( - width: 25.w, - height: 25.h, - opacity1: 0.26, - opacity2: 0.26, - borderwidth: 0.5, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - "assets/images/png/Vector (4).png", - height: 12.h, - width: 12.w, - )), - ), - sizedBoxWidth(12.w), - text14400whiteblur('Rowing, Football, Swimming'), - // interestText - // text14400whiteblur(getEditProfileIndi! - // .data!.interest! - // .join(', ')), - // text14400whiteblur( - // "Rowing, Football, Swimming"), - ], - ), - sizedBoxHeight(25.h), - // commonGlassUI( - // width: double.infinity, - // height: 135.h, - // borderRadius: BorderRadius.circular(10), - // customWidget: Padding( - // padding: EdgeInsets.symmetric( - // vertical: 12.h, horizontal: 16.w), - // child: Column( - // children: [ - // Row( - // children: [ - // text16w700white("Badges"), - // Spacer(), - // GestureDetector( - // onTap: () { - // Get.toNamed(RouteName.badges); - // }, - // child: text12400white("View more")) - // ], - // ), - // sizedBoxHeight(8.h), - // Row( - // mainAxisAlignment: - // MainAxisAlignment.spaceBetween, - // children: [ - // Image.asset( - // "assets/images/png/Frame 1000004056.png", - // height: 70.h, - // width: 74.w, - // ), - // Image.asset( - // "assets/images/png/Frame 1000004056.png", - // height: 70.h, - // width: 74.w, - // ), - // Image.asset( - // "assets/images/png/Frame 1000004056.png", - // height: 70.h, - // width: 74.w, - // ), - // Image.asset( - // "assets/images/png/Frame 1000004056.png", - // height: 70.h, - // width: 74.w, - // ), - // ], - // ), - // ], - // ), - // ), - // // border: 1 - // ), - ], - ), - ), - sizedBoxHeight(20.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - text18w700white("Timeline"), - Spacer(), - InkWell( - onTap: () { - Get.toNamed(RouteName.addtimeline); - }, - child: Image.asset( - "assets/images/png/iconamoon_edit-thin.png", - height: 20.h, - width: 20.w, - ), - ) - ], - ), - sizedBoxHeight(20.h), - SizedBox( - height: 300.h, - child: ListView.builder( - shrinkWrap: true, - itemCount: timeline.length, - itemBuilder: (context, index) { - return commonTimelineCard( - imagePath: timeline[index]["imagePath"], - title: timeline[index]["title"]); - }, - )), - sizedBoxHeight(30.h), - Row( - children: [ - text16w700white("Certifications/Qualifications"), - Spacer(), - InkWell( - onTap: () { - Get.toNamed(RouteName.certificate); - }, - child: text12400white("View more")), - ], - ), - sizedBoxHeight(20.h), - SizedBox( - height: 85.h, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: certificationData.length, - itemBuilder: (context, index) { - return Padding( - padding: EdgeInsets.only(right: 20.w), - child: certificationCardTile( - imagePath: certificationData[index] - ["imagePath"], - title: certificationData[index]["title"], - subtitle: certificationData[index] - ["subtitle"], - date: certificationData[index]["date"]), - ); - }, - ), - ), - sizedBoxHeight(30.h), - text18w400white("Subgroups"), - ]), - ), - sizedBoxHeight(20.h), - SizedBox( - height: 190.h, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.only(left: 16.w), - itemCount: cardtile.length, - itemBuilder: (context, index) { - return Padding( - padding: EdgeInsets.only(right: 20.w), - child: profilecardtile( - imagePath: cardtile[index]["imagePath"], - title: cardtile[index]["title"]), - ); - }, - ), - ), - sizedBoxHeight(20.h), - Padding( - padding: EdgeInsets.only(left: 16.w), - child: text18w700white("Activity"), - ), - normalcardtile( - profileImg: 'assets/images/png/Ellipse 48.png', - title: 'Jocelyn Dokidis', - mainImg: 'assets/images/png/Rectangle 46.png', - containerTitle: [ - 'Race', - 'Swimming', - 'Events', - 'Marathon', - 'Events' - ]), - sizedBoxHeight(120.h), - ], - ), - ), - ), - Positioned.fill( - top: 40.h, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - children: [ - sizedBoxHeight(20.h), - Row( - children: [ - Spacer(), - commonContainer( - width: 40.w, - height: 40.h, - borderwidth: 0.5, - boxShape: BoxShape.circle, - opacity1: 0.5, - opacity2: 0.6, - customWidget: - PopupMenuButton( - surfaceTintColor: const Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 200.w), - offset: const Offset(0, 50), - color: const Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () { - Get.toNamed(RouteName.shareProfile); - }, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Share profile', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/share.png", - height: 17.h, - width: 17.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Report user', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/Vector (5).png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Block user', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - const Spacer(), - Image.asset( - "assets/images/png/blocked.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Center( - child: Image.asset( - 'assets/images/png/Group 1000004071.png', - height: 20.h, - width: 20.w, - )), - ), - - ), - ], - ), - ], - ), - ), - ), - ]), - ); - } -} - -Widget commonTimelineCard({required String imagePath, required String title}) { - return Row( - children: [ - Container( - width: 10, - height: 170.h, - child: Stack( - clipBehavior: Clip.none, - children: [ - Positioned( - top: 50.h, - child: Container( - height: 11.h, - width: 11.w, - decoration: BoxDecoration( - color: Colors.white, shape: BoxShape.circle)), - ), - Positioned( - right: 3.w, - child: Container( - width: 1.w, - height: 170.h, - decoration: BoxDecoration(color: Colors.white), - ), - ), - ], - ), - ), - sizedBoxWidth(20.w), - Expanded( - child: Column( - children: [ - commonGlassUI( - width: double.infinity, - height: 145.h, - borderRadius: BorderRadius.circular(10.r), - customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - CircleAvatar( - radius: 10.r, - backgroundImage: AssetImage(imagePath), - ), - sizedBoxWidth(8.w), - text14700white(title) - ], - ), - sizedBoxHeight(10.h), - text12700white("Team captain"), - sizedBoxHeight(8.h), - text12400white("April 2023 - May 2024"), - sizedBoxHeight(10.h), - text10400whiteblur( - "Lorem Ipsum is simply dummy text of the printing and typesetting industry.") - ], - ), - ), - // border: 1 - ), - ], - ), - ), - ], - ); -} - -Widget normalcardtile({ - required String profileImg, - required String title, - required String mainImg, - required List containerTitle, -}) { - var mainImage = 'assets/images/png/uiw_like-o.png'.obs; - void updateImage(String reaction) { - if (reaction == 'like') { - mainImage.value = 'assets/images/png/f7_hand-thumbsup.png'; - } else if (reaction == 'heart') { - mainImage.value = 'assets/images/png/heart 2.png'; - } else if (reaction == 'party') { - mainImage.value = 'assets/images/png/party-popper 2.png'; - } - } - - return Column( - children: [ - sizedBoxHeight(25.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - foregroundImage: AssetImage(profileImg), - radius: 25.r, - ), - sizedBoxWidth(12.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16w400_FCFCFC(title), - sizedBoxHeight(5.h), - Row( - children: [ - Image.asset( - 'assets/images/png/community 1 (traced).png', - height: 14.w, - width: 14.w, - ), - sizedBoxWidth(7.w), - text12w400_FCFCFC('Active alliance network'), - sizedBoxWidth(7.w), - Icon( - Icons.circle, - color: Color(0xFFFCFCFC), - size: 4.sp, - ), - sizedBoxWidth(6.w), - text12w400_FCFCFC('1 Hour ago'), - ], - ) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 50), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => [ - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Report Post', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/Vector (5).png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Share post', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/share.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - Text( - 'Pin', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, - fontWeight: FontWeight.w800, - fontFamily: "Nunito Sans", - ), - ), - Spacer(), - Image.asset( - "assets/images/png/f7_pin-fill (2).png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Image.asset( - 'assets/images/png/Group 1000004071.png', - width: 16.w, - height: 18.h, - ), - ), - sizedBoxWidth(5.w) - ], - ), - ), - sizedBoxHeight(20.h), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.postdetailsScreen); - }, - child: Container( - height: 163.h, - width: double.infinity, - child: Image.asset( - mainImg, - fit: BoxFit.cover, - ), - )), - sizedBoxHeight(20.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Column(children: [ - SizedBox( - height: 30.h, - child: ListView.builder( - scrollDirection: Axis.horizontal, - shrinkWrap: true, - itemCount: containerTitle.length, - itemBuilder: (context, index) { - return Padding( - padding: EdgeInsets.only(right: 12.w), - child: GestureDetector( - onTap: () { - // Get.toNamed(RouteName.cyclescreen); - }, - child: containertile(text: containerTitle[index])), - ); - }, - ), - ), - sizedBoxHeight(20.h), - text16w400_FCFCFC( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s . . ."), - Row(children: [ - stackReaction(number: '20', containerImages: [ - 'assets/images/png/f7_hand-thumbsup.png', - 'assets/images/png/heart 2.png', - 'assets/images/png/party-popper 2.png' - ]), - Spacer(), - commonContainer( - width: 30.w, - height: 30.h, - opacity1: 0.2, - opacity2: 0.2, - borderwidth: 0.43, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - 'assets/images/png/Frame 1000004088.png', - height: 13.h, - width: 13.w, - ), - ), - ), - sizedBoxWidth(12.w), - text14w400_FCFCFC('20'), - sizedBoxWidth(20.w), - commonContainer( - width: 30.w, - height: 30.h, - opacity1: 0.2, - opacity2: 0.2, - borderwidth: 0.43, - boxShape: BoxShape.circle, - customWidget: Center( - child: Image.asset( - 'assets/images/png/Vector (1).png', - height: 12.h, - width: 12.w, - ), - ), - ), - sizedBoxWidth(12.w), - text14w400_FCFCFC('10'), - ]), - sizedBoxHeight(30.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Obx(() { - return ReactionButton( - onReactionChanged: (reaction) { - updateImage(reaction?.value ?? 'like'); - debugPrint('Selected value: ${reaction?.value}'); - }, - reactions: ?>[ - Reaction( - value: 'like', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - icon: _buildReactionsIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - ), - Reaction( - value: 'heart', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/heart 2.png'), - icon: _buildReactionsIcon( - 'assets/images/png/heart 2.png'), - ), - Reaction( - value: 'party', - previewIcon: _buildReactionsPreviewIcon( - 'assets/images/png/party-popper 2.png'), - icon: _buildReactionsIcon( - 'assets/images/png/party-popper 2.png'), - ), - ], - selectedReaction: Reaction( - value: 'like', - icon: _buildReactionsIcon( - 'assets/images/png/f7_hand-thumbsup.png'), - ), - boxColor: Colors.white, - boxElevation: 9, - boxRadius: 30, - itemsSpacing: 8, - itemScale: 0.4, - itemSize: Size(45, 45), - boxPadding: EdgeInsets.all(8), - boxAnimationDuration: Duration(milliseconds: 200), - itemAnimationDuration: Duration(milliseconds: 500), - hoverDuration: Duration(milliseconds: 700), - // toggle: false, - - child: _buildReactionsIcon(mainImage.value), - ); - }) - ], - ), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.postdetailsScreen); - }, - child: Column( - children: [ - Image.asset( - 'assets/images/png/Frame 1000004088.png', - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Comment') - ], - ), - ), - Column( - children: [ - Image.asset( - 'assets/images/png/Frame 1000004089.png', - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Save') - ], - ) - ], - ) - ]), - ), - ], - ); -} - -Widget certificationCardTile({ - required String imagePath, - required String title, - required String subtitle, - required String date, -}) { - return commonGlassUI( - width: 270.w, - height: 70.h, - borderRadius: BorderRadius.circular(10.r), - customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - height: 40.h, - width: 57.w, - child: Image.asset( - imagePath, - fit: BoxFit.cover, - ), - ), - sizedBoxWidth(10.w), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - text12400white(title), - sizedBoxHeight(5.h), - text9400white(subtitle), - sizedBoxHeight(5.h), - text9400white(date) - ], - ), - ), - ], - ), - ), - // border: 1 - ); -} - -Widget _buildReactionsPreviewIcon(String assetPath) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - assetPath, - height: 40.h, - width: 40.w, - ), - ); -} - -Widget _buildReactionsIcon(String assetPath) { - return Column( - children: [ - Image.asset( - assetPath, - height: 19.h, - width: 19.w, - ), - sizedBoxHeight(8.h), - text11w400_FCFCFC('Like') - ], - ); -} - -Widget containertile({required String text}) { - return commonContainer( - width: 100.w, - height: 30.h, - borderRadius: BorderRadius.circular(30.r), - borderColor: Color(0xFFD90B2E), - borderwidth: 0.9, - customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.w), - child: Center(child: text14w400_FCFCFC(text)), - )); -} - -Widget profilecardtile({required String imagePath, required String title}) { - return Column( - children: [ - Container( - height: 109.h, - width: 100.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.r), - ), - child: Image.asset(imagePath), - ), - sizedBoxHeight(10.h), - SizedBox(width: 100.w, child: text12w700_FCFCFC(title)), - ], - ); -} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart new file mode 100644 index 0000000..eaa866c --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart @@ -0,0 +1,82 @@ +class GetGuestFollowers { + String? status; + int? statusCode; + String? message; + List? data; + + GetGuestFollowers({this.status, this.statusCode, this.message, this.data}); + + GetGuestFollowers.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? followingIamPrincipalXid; + int? iamPrincipalXid; + Follower? follower; + + Data({this.followingIamPrincipalXid, this.iamPrincipalXid, this.follower}); + + Data.fromJson(Map json) { + followingIamPrincipalXid = json['following_iam_principal_xid']; + iamPrincipalXid = json['iam_principal_xid']; + follower = json['follower'] != null + ? new Follower.fromJson(json['follower']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['following_iam_principal_xid'] = this.followingIamPrincipalXid; + data['iam_principal_xid'] = this.iamPrincipalXid; + if (this.follower != null) { + data['follower'] = this.follower!.toJson(); + } + return data; + } +} + +class Follower { + int? id; + String? userName; + String? fullName; + String? profilePhoto; + + Follower({this.id, this.userName, this.fullName, this.profilePhoto}); + + Follower.fromJson(Map json) { + id = json['id']; + userName = json['user_name']; + fullName = json['full_name']; + profilePhoto = json['profile_photo']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['user_name'] = this.userName; + data['full_name'] = this.fullName; + data['profile_photo'] = this.profilePhoto; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart new file mode 100644 index 0000000..ad8a848 --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart @@ -0,0 +1,82 @@ +class GetGuestFollowing { + String? status; + int? statusCode; + String? message; + List? data; + + GetGuestFollowing({this.status, this.statusCode, this.message, this.data}); + + GetGuestFollowing.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? followingIamPrincipalXid; + int? iamPrincipalXid; + Following? following; + + Data({this.followingIamPrincipalXid, this.iamPrincipalXid, this.following}); + + Data.fromJson(Map json) { + followingIamPrincipalXid = json['following_iam_principal_xid']; + iamPrincipalXid = json['iam_principal_xid']; + following = json['following'] != null + ? new Following.fromJson(json['following']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['following_iam_principal_xid'] = this.followingIamPrincipalXid; + data['iam_principal_xid'] = this.iamPrincipalXid; + if (this.following != null) { + data['following'] = this.following!.toJson(); + } + return data; + } +} + +class Following { + int? id; + String? userName; + String? fullName; + String? profilePhoto; + + Following({this.id, this.userName, this.fullName, this.profilePhoto}); + + Following.fromJson(Map json) { + id = json['id']; + userName = json['user_name']; + fullName = json['full_name']; + profilePhoto = json['profile_photo']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['user_name'] = this.userName; + data['full_name'] = this.fullName; + data['profile_photo'] = this.profilePhoto; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataBus.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataBus.dart new file mode 100644 index 0000000..3d5cdfe --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataBus.dart @@ -0,0 +1,179 @@ +class GuestGetProfileDataBus { + String? status; + int? statusCode; + String? message; + Data? data; + + GuestGetProfileDataBus( + {this.status, this.statusCode, this.message, this.data}); + + GuestGetProfileDataBus.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + data = json['data'] != null ? new Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + int? id; + int? businessTypeXid; + String? businessOwnerName; + String? businessName; + String? businessLocation; + String? businessContactNumber; + String? businessEmail; + String? businessHandle; + String? websiteLink; + String? googleReviewLink; + String? businessLogo; + String? tags; + String? bannerImage; + Follows? follows; + BusinessType? businessType; + + Data( + {this.id, + this.businessTypeXid, + this.businessOwnerName, + this.businessName, + this.businessLocation, + this.businessContactNumber, + this.businessEmail, + this.businessHandle, + this.websiteLink, + this.googleReviewLink, + this.businessLogo, + this.tags, + this.bannerImage, + this.follows, + this.businessType}); + + Data.fromJson(Map json) { + id = json['id']; + businessTypeXid = json['business_type_xid']; + businessOwnerName = json['business_owner_name']; + businessName = json['business_name']; + businessLocation = json['business_location']; + businessContactNumber = json['business_contact_number']; + businessEmail = json['business_email']; + businessHandle = json['business_handle']; + websiteLink = json['website_link']; + googleReviewLink = json['google_review_link']; + businessLogo = json['business_logo']; + tags = json['tags']; + bannerImage = json['banner_image']; + follows = + json['follows'] != null ? new Follows.fromJson(json['follows']) : null; + businessType = json['business_type'] != null + ? new BusinessType.fromJson(json['business_type']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['business_type_xid'] = this.businessTypeXid; + data['business_owner_name'] = this.businessOwnerName; + data['business_name'] = this.businessName; + data['business_location'] = this.businessLocation; + data['business_contact_number'] = this.businessContactNumber; + data['business_email'] = this.businessEmail; + data['business_handle'] = this.businessHandle; + data['website_link'] = this.websiteLink; + data['google_review_link'] = this.googleReviewLink; + data['business_logo'] = this.businessLogo; + data['tags'] = this.tags; + data['banner_image'] = this.bannerImage; + if (this.follows != null) { + data['follows'] = this.follows!.toJson(); + } + if (this.businessType != null) { + data['business_type'] = this.businessType!.toJson(); + } + return data; + } +} + +class Follows { + int? following; + int? followers; + + Follows({this.following, this.followers}); + + Follows.fromJson(Map json) { + following = json['following']; + followers = json['followers']; + } + + Map toJson() { + final Map data = new Map(); + data['following'] = this.following; + data['followers'] = this.followers; + return data; + } +} + +class BusinessType { + int? id; + String? name; + String? image; + String? description; + int? isActive; + String? createdBy; + String? modifiedBy; + String? deletedAt; + String? createdAt; + String? updatedAt; + + BusinessType( + {this.id, + this.name, + this.image, + this.description, + this.isActive, + this.createdBy, + this.modifiedBy, + this.deletedAt, + this.createdAt, + this.updatedAt}); + + BusinessType.fromJson(Map json) { + id = json['id']; + name = json['name']; + image = json['image']; + description = json['description']; + isActive = json['is_active']; + createdBy = json['created_by']; + modifiedBy = json['modified_by']; + deletedAt = json['deleted_at']; + createdAt = json['created_at']; + updatedAt = json['updated_at']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['image'] = this.image; + data['description'] = this.description; + data['is_active'] = this.isActive; + data['created_by'] = this.createdBy; + data['modified_by'] = this.modifiedBy; + data['deleted_at'] = this.deletedAt; + data['created_at'] = this.createdAt; + data['updated_at'] = this.updatedAt; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart new file mode 100644 index 0000000..fa2e75c --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart @@ -0,0 +1,296 @@ +class GuestGetProfileDataIndi { + String? status; + int? statusCode; + String? message; + Data? data; + + GuestGetProfileDataIndi( + {this.status, this.statusCode, this.message, this.data}); + + GuestGetProfileDataIndi.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + data = json['data'] != null ? new Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + int? id; + String? userName; + String? fullName; + String? gender; + String? dateOfBirth; + List? interest; + String? about; + String? position; + String? trainingScores; + String? height; + String? weight; + String? battingAverage; + Follows? follows; + List? timelines; + int? accountVisibility; + List? myJoinedSubgroups; + + Data( + {this.id, + this.userName, + this.fullName, + this.gender, + this.dateOfBirth, + this.interest, + this.about, + this.position, + this.trainingScores, + this.height, + this.weight, + this.battingAverage, + this.follows, + this.timelines, + this.accountVisibility, + this.myJoinedSubgroups}); + + Data.fromJson(Map json) { + id = json['id']; + userName = json['user_name']; + fullName = json['full_name']; + gender = json['gender']; + dateOfBirth = json['date_of_birth']; + if (json['interest'] != null) { + interest = []; + json['interest'].forEach((v) { + interest!.add(new Interest.fromJson(v)); + }); + } + about = json['about']; + position = json['position']; + trainingScores = json['training_scores']; + height = json['height']; + weight = json['weight']; + battingAverage = json['batting_average']; + follows = + json['follows'] != null ? new Follows.fromJson(json['follows']) : null; + if (json['timelines'] != null) { + timelines = []; + json['timelines'].forEach((v) { + timelines!.add(new Timelines.fromJson(v)); + }); + } + accountVisibility = json['account_visibility']; + if (json['my_joined_subgroups'] != null) { + myJoinedSubgroups = []; + json['my_joined_subgroups'].forEach((v) { + myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['user_name'] = this.userName; + data['full_name'] = this.fullName; + data['gender'] = this.gender; + data['date_of_birth'] = this.dateOfBirth; + if (this.interest != null) { + data['interest'] = this.interest!.map((v) => v.toJson()).toList(); + } + data['about'] = this.about; + data['position'] = this.position; + data['training_scores'] = this.trainingScores; + data['height'] = this.height; + data['weight'] = this.weight; + data['batting_average'] = this.battingAverage; + if (this.follows != null) { + data['follows'] = this.follows!.toJson(); + } + if (this.timelines != null) { + data['timelines'] = this.timelines!.map((v) => v.toJson()).toList(); + } + data['account_visibility'] = this.accountVisibility; + if (this.myJoinedSubgroups != null) { + data['my_joined_subgroups'] = + this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); + } + return data; + } +} +class Interest { + int? id; + String? name; + + Interest({this.id, this.name}); + + Interest.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + +class Follows { + int? following; + int? followers; + + Follows({this.following, this.followers}); + + Follows.fromJson(Map json) { + following = json['following']; + followers = json['followers']; + } + + Map toJson() { + final Map data = new Map(); + data['following'] = this.following; + data['followers'] = this.followers; + return data; + } +} + +class Timelines { + int? id; + String? clubName; + String? roleName; + String? teamName; + String? startDate; + String? endDate; + String? abilitiesXids; + List? abilities; + + Timelines( + {this.id, + this.clubName, + this.roleName, + this.teamName, + this.startDate, + this.endDate, + this.abilitiesXids, + this.abilities}); + + Timelines.fromJson(Map json) { + id = json['id']; + clubName = json['club_name']; + roleName = json['role_name']; + teamName = json['team_name']; + startDate = json['start_date']; + endDate = json['end_date']; + abilitiesXids = json['abilities_xids']; + if (json['abilities'] != null) { + abilities = []; + json['abilities'].forEach((v) { + abilities!.add(new Abilities.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['club_name'] = this.clubName; + data['role_name'] = this.roleName; + data['team_name'] = this.teamName; + data['start_date'] = this.startDate; + data['end_date'] = this.endDate; + data['abilities_xids'] = this.abilitiesXids; + if (this.abilities != null) { + data['abilities'] = this.abilities!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Abilities { + int? id; + String? name; + + Abilities({this.id, this.name}); + + Abilities.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + +class MyJoinedSubgroups { + int? id; + int? iamPrincipalXid; + int? manageGroupXid; + int? manageSubGroupXid; + SubGroupData? subGroupData; + + MyJoinedSubgroups( + {this.id, + this.iamPrincipalXid, + this.manageGroupXid, + this.manageSubGroupXid, + this.subGroupData}); + + MyJoinedSubgroups.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + manageGroupXid = json['manage_group_xid']; + manageSubGroupXid = json['manage_sub_group_xid']; + subGroupData = json['sub_group_data'] != null + ? new SubGroupData.fromJson(json['sub_group_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['iam_principal_xid'] = this.iamPrincipalXid; + data['manage_group_xid'] = this.manageGroupXid; + data['manage_sub_group_xid'] = this.manageSubGroupXid; + if (this.subGroupData != null) { + data['sub_group_data'] = this.subGroupData!.toJson(); + } + return data; + } +} + +class SubGroupData { + int? id; + String? title; + String? subGroupImage; + + SubGroupData({this.id, this.title, this.subGroupImage}); + + SubGroupData.fromJson(Map json) { + id = json['id']; + title = json['title']; + subGroupImage = json['sub_group_image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['sub_group_image'] = this.subGroupImage; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart new file mode 100644 index 0000000..ade1a7f --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart @@ -0,0 +1,857 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_reaction_button/flutter_reaction_button.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:regroup/Common/CommonGlassmorphism.dart'; +import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; + +class profiletabBusGest extends StatefulWidget { + const profiletabBusGest({super.key}); + + @override + State createState() => _profiletabBusGestState(); +} + +class _profiletabBusGestState extends State { + late Future guestBusfuture; + var updata; + + @override + void initState() { + // TODO: implement initState + updata = "64"; + + guestBusfuture = GuestProfileApi().getGuestProfileBus(updata); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + // accountTypeValue == '1' || + body: FutureBuilder( + future: guestBusfuture, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center( + child: CircularProgressIndicator( + color: Colors.blue, + ), + ); + } + + if (snapshot.hasError) { + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18.spMin), + ), + ); + } + + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + print("Data fetched-->"); + return Stack(clipBehavior: Clip.none, children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SafeArea( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: 484.h, + width: double.infinity, + child: Image.asset( + "assets/images/png/Rectangle 49 (1).png", + fit: BoxFit.cover, + ), + ), + Positioned.fill( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color.fromRGBO(34, 41, 53, 0.1), + Color.fromRGBO(34, 41, 53, 0.79), + ], + stops: [ + 0.5788, + 0.8, + ], + ), + ), + ), + ), + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Column( + children: [ + text20700white(guestGetProfileBus! + .data!.businessOwnerName ?? + "Victory gear sports emporium"), + sizedBoxHeight(5.h), + text18w400white(guestGetProfileBus! + .data!.businessName ?? + "@Victorygames_10"), + sizedBoxHeight(15.h), + Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + Get.toNamed( + RouteName.followers); + }, + child: Column( + children: [ + text16400white( + guestGetProfileBus! + .data! + .follows! + .followers + .toString() ?? + "254"), + sizedBoxHeight(6.h), + text12400whiteblur( + "Followers") + ], + ), + ), + sizedBoxWidth(20.w), + Container( + height: 58.h, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.white, + width: 1.0, + ), + boxShadow: [ + BoxShadow( + color: Color(0x66000000), + offset: Offset(0, 4), + blurRadius: 4.0, + ), + ], + ), + ), + sizedBoxWidth(20.w), + GestureDetector( + onTap: () { + Get.toNamed( + RouteName.following); + }, + child: Column( + children: [ + text16400white( + guestGetProfileBus! + .data! + .follows! + .following + .toString() ?? + "344"), + sizedBoxHeight(6.h), + text12400whiteblur( + "Following") + ], + ), + ), + ], + ), + sizedBoxHeight(20.h), + ], + ), + ], + ), + ), + ), + ], + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(30.h), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + // Get.toNamed(RouteName.buseditprofile); + }, + child: Container( + height: 40.h, + width: 170.w, + decoration: BoxDecoration( + color: Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular(30.r), + ), + child: Center( + child: text16w400_FCFCFC("Follow")), + ), + ), + GestureDetector( + onTap: () { + // Get.toNamed(RouteName.shareProfile); + }, + child: commonGlassUI( + width: 170.w, + height: 40.h, + + opacity1: 0.05, + opacity2: 0.07, + borderRadius: + BorderRadius.circular(30.r), + mainOpacity: 1, + customWidget: Center( + child: text16w400_FCFCFC("Message"), + ), + // border: 1, + ), + ) + ], + ), + sizedBoxHeight(30.h), + text18w700white("About"), + sizedBoxHeight(10.h), + text14400white( + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), + sizedBoxHeight(25.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/Frame 24.png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + text14400whiteblur("James Bothman"), + ], + ), + sizedBoxHeight(20.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/Vector2a.png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + text14400whiteblur( + "www.exampledummywebsite.com"), + ], + ), + sizedBoxHeight(20.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/Group 58645.png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + text14400whiteblur( + "Elm street london, United Kingdom"), + ], + ), + sizedBoxHeight(20.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/calender.png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + // text14400whiteblur(getEditProfileIndi! + // .data!.interest! + // .join(', ')), + text14400whiteblur("Founded at : 2010"), + ], + ), + sizedBoxHeight(30.h), + ], + ), + ), + sizedBoxHeight(30.h), + Padding( + padding: EdgeInsets.only(left: 16.w), + child: text18w700white("Posts"), + ), + normalcardtile( + profileImg: 'assets/images/png/Ellipse 48.png', + title: 'Jocelyn Dokidis', + mainImg: 'assets/images/png/Rectangle 46.png', + containerTitle: [ + 'Race', + 'Swimming', + 'Events', + 'Marathon', + 'Events' + ]), + sizedBoxHeight(120.h), + ], + ), + ), + ), + Positioned.fill( + top: 40.h, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + children: [ + sizedBoxHeight(20.h), + Row( + children: [ + Spacer(), + commonContainer( + width: 40.w, + height: 40.h, + borderwidth: 0.5, + boxShape: BoxShape.circle, + opacity1: 0.5, + opacity2: 0.6, + customWidget: PopupMenuButton( + surfaceTintColor: const Color(0xFF222935), + constraints: + BoxConstraints.tightFor(width: 200.w), + offset: const Offset(0, 50), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () { + Get.toNamed(RouteName.shareProfile); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Share profile', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/share.png", + height: 17.h, + width: 17.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Report user', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/Vector (5).png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Block user', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/blocked.png", + height: 18.h, + width: 18.w, + ) + ], + ), + ), + ), + ], + child: Center( + child: Image.asset( + 'assets/images/png/Group 1000004071.png', + height: 20.h, + width: 20.w, + )), + ), + ), + ], + ), + ], + ), + ), + ), + ]); + } + return Container(); + })); + } +} + +Widget normalcardtile({ + required String profileImg, + required String title, + required String mainImg, + required List containerTitle, +}) { + var mainImage = 'assets/images/png/uiw_like-o.png'.obs; + void updateImage(String reaction) { + if (reaction == 'like') { + mainImage.value = 'assets/images/png/f7_hand-thumbsup.png'; + } else if (reaction == 'heart') { + mainImage.value = 'assets/images/png/heart 2.png'; + } else if (reaction == 'party') { + mainImage.value = 'assets/images/png/party-popper 2.png'; + } + } + + return Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAvatar( + foregroundImage: AssetImage(profileImg), + radius: 25.r, + ), + sizedBoxWidth(12.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16w400_FCFCFC(title), + sizedBoxHeight(5.h), + Row( + children: [ + Image.asset( + 'assets/images/png/community 1 (traced).png', + height: 14.w, + width: 14.w, + ), + sizedBoxWidth(7.w), + text12w400_FCFCFC('Active alliance network'), + sizedBoxWidth(7.w), + Icon( + Icons.circle, + color: Color(0xFFFCFCFC), + size: 4.sp, + ), + sizedBoxWidth(6.w), + text12w400_FCFCFC('1 Hour ago'), + ], + ) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: BoxConstraints.tightFor(width: 176.w), + offset: Offset(0, 50), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Report Post', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/Vector (5).png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Share post', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/share.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Pin', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/f7_pin-fill (2).png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Image.asset( + 'assets/images/png/Group 1000004071.png', + width: 16.w, + height: 18.h, + ), + ), + sizedBoxWidth(5.w) + ], + ), + ), + sizedBoxHeight(20.h), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.postdetailsScreen); + }, + child: Container( + height: 163.h, + width: double.infinity, + child: Image.asset( + mainImg, + fit: BoxFit.cover, + ), + )), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column(children: [ + SizedBox( + height: 30.h, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: containerTitle.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(right: 12.w), + child: GestureDetector( + onTap: () { + // Get.toNamed(RouteName.cyclescreen); + }, + child: containertile(text: containerTitle[index])), + ); + }, + ), + ), + sizedBoxHeight(20.h), + text16w400_FCFCFC( + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s . . ."), + Row(children: [ + stackReaction(number: '20', containerImages: [ + 'assets/images/png/f7_hand-thumbsup.png', + 'assets/images/png/heart 2.png', + 'assets/images/png/party-popper 2.png' + ]), + Spacer(), + commonContainer( + width: 30.w, + height: 30.h, + opacity1: 0.2, + opacity2: 0.2, + borderwidth: 0.43, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + 'assets/images/png/Frame 1000004088.png', + height: 13.h, + width: 13.w, + ), + ), + ), + sizedBoxWidth(12.w), + text14w400_FCFCFC('20'), + sizedBoxWidth(20.w), + commonContainer( + width: 30.w, + height: 30.h, + opacity1: 0.2, + opacity2: 0.2, + borderwidth: 0.43, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + 'assets/images/png/Vector (1).png', + height: 12.h, + width: 12.w, + ), + ), + ), + sizedBoxWidth(12.w), + text14w400_FCFCFC('10'), + ]), + sizedBoxHeight(30.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx(() { + return ReactionButton( + onReactionChanged: (reaction) { + updateImage(reaction?.value ?? 'like'); + debugPrint('Selected value: ${reaction?.value}'); + }, + reactions: ?>[ + Reaction( + value: 'like', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + icon: _buildReactionsIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + ), + Reaction( + value: 'heart', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/heart 2.png'), + icon: _buildReactionsIcon( + 'assets/images/png/heart 2.png'), + ), + Reaction( + value: 'party', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/party-popper 2.png'), + icon: _buildReactionsIcon( + 'assets/images/png/party-popper 2.png'), + ), + ], + selectedReaction: Reaction( + value: 'like', + icon: _buildReactionsIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + ), + boxColor: Colors.white, + boxElevation: 9, + boxRadius: 30, + itemsSpacing: 8, + itemScale: 0.4, + itemSize: Size(45, 45), + boxPadding: EdgeInsets.all(8), + boxAnimationDuration: Duration(milliseconds: 200), + itemAnimationDuration: Duration(milliseconds: 500), + hoverDuration: Duration(milliseconds: 700), + // toggle: false, + + child: _buildReactionsIcon(mainImage.value), + ); + }) + ], + ), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.postdetailsScreen); + }, + child: Column( + children: [ + Image.asset( + 'assets/images/png/Frame 1000004088.png', + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Comment') + ], + ), + ), + Column( + children: [ + Image.asset( + 'assets/images/png/Frame 1000004089.png', + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Save') + ], + ) + ], + ) + ]), + ), + ], + ); +} + +Widget _buildReactionsPreviewIcon(String assetPath) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + assetPath, + height: 40.h, + width: 40.w, + ), + ); +} + +Widget _buildReactionsIcon(String assetPath) { + return Column( + children: [ + Image.asset( + assetPath, + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Like') + ], + ); +} + +Widget containertile({required String text}) { + return commonContainer( + width: 100.w, + height: 30.h, + borderRadius: BorderRadius.circular(30.r), + borderColor: Color(0xFFD90B2E), + borderwidth: 0.9, + customWidget: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: Center(child: text14w400_FCFCFC(text)), + )); +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart new file mode 100644 index 0000000..9630ae5 --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -0,0 +1,1204 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_reaction_button/flutter_reaction_button.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:regroup/Common/CommonGlassmorphism.dart'; +import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; + +class ProfileTabIndGuest extends StatefulWidget { + const ProfileTabIndGuest({super.key}); + + @override + State createState() => _ProfileTabIndGuestState(); +} + +class _ProfileTabIndGuestState extends State { + List cardtile = [ + { + "imagePath": "assets/images/png/Rectangle 29ss.png", + "title": "Cardio crusaders circle" + }, + { + "imagePath": "assets/images/png/Rectangle 31ee.png", + "title": "Strength squad syndicate" + }, + { + "imagePath": "assets/images/png/Rectangle 30aa.png", + "title": "Flexibility faction force" + }, + { + "imagePath": "assets/images/png/Rectangle 29ss.png", + "title": "Cardio crusaders circle" + }, + ]; + + List timeline = [ + { + "imagePath": "assets/images/png/cimg1.png", + "title": "Cardio crusaders circle" + }, + { + "imagePath": "assets/images/png/cimg1.png", + "title": "Cardio crusaders circle" + }, + { + "imagePath": "assets/images/png/cimg1.png", + "title": "Cardio crusaders circle" + }, + { + "imagePath": "assets/images/png/cimg1.png", + "title": "Cardio crusaders circle" + }, + ]; + + List certificationData = [ + { + "imagePath": "assets/images/png/image 17.png", + "title": "Professional sports management", + "subtitle": "Athlete 365 ", + "date": "Issued Feb 2024" + }, + { + "imagePath": "assets/images/png/image 18.png", + "title": "Professional sports management", + "subtitle": "Athlete 365 ", + "date": "Issued Feb 2024" + }, + { + "imagePath": "assets/images/png/image 19.png", + "title": "Professional sports management", + "subtitle": "Athlete 365 ", + "date": "Issued Feb 2024" + }, + ]; + + late Future guestIndfuture; + var updata; + + // FollowingidIndex + + @override + void initState() { + // updata = Get.arguments != null + // ? Get.arguments['FolloweridIndex'] + // : Get.arguments != null + // ? Get.arguments['FollowingidIndex'] + // : "56"; + updata = Get.arguments?['FolloweridIndex'] ?? + Get.arguments?['FollowingidIndex'] ?? + "56"; + + guestIndfuture = GuestProfileApi().getGuestProfileInd(updata); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + // accountTypeValue == '1' || + body: FutureBuilder( + future: guestIndfuture, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center( + child: CircularProgressIndicator( + color: Colors.blue, + ), + ); + } + + if (snapshot.hasError) { + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18.spMin), + ), + ); + } + + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + print("Data fetched-->"); + return Stack(clipBehavior: Clip.none, children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SafeArea( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + height: 484.h, + width: double.infinity, + child: Image.asset( + "assets/images/png/profileimg.png", + fit: BoxFit.cover, + ), + ), + Positioned.fill( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color.fromRGBO(34, 41, 53, 0.1), + Color.fromRGBO(34, 41, 53, 0.79), + ], + stops: [ + 0.5788, + 0.8, + ], + ), + ), + ), + ), + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Column( + children: [ + text20700white(guestGetProfileInd! + .data!.fullName ?? + "Edward Hackett"), + sizedBoxHeight(5.h), + text18w400white(guestGetProfileInd! + .data!.userName ?? + "@edward_01"), + sizedBoxHeight(15.h), + Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + Get.toNamed( + RouteName.followers, + arguments: { + 'UpdataGuestIdfollowers': + updata, + }); + }, + child: Column( + children: [ + text16400white( + guestGetProfileInd! + .data! + .follows! + .followers + .toString() ?? + "254"), + sizedBoxHeight(6.h), + text12400whiteblur( + "Followers") + ], + ), + ), + sizedBoxWidth(20.w), + Container( + height: 58.h, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.white, + width: 1.0, + ), + boxShadow: [ + BoxShadow( + color: Color(0x66000000), + offset: Offset(0, 4), + blurRadius: 4.0, + ), + ], + ), + ), + sizedBoxWidth(20.w), + GestureDetector( + onTap: () { + Get.toNamed( + RouteName.following, + arguments: { + 'UpdataGuestIdfollowing': + updata, + }); + }, + child: Column( + children: [ + text16400white( + guestGetProfileInd! + .data! + .follows! + .following + .toString() ?? + "254"), + sizedBoxHeight(6.h), + text12400whiteblur( + "Following") + ], + ), + ), + sizedBoxWidth(20.w), + Container( + height: 58.h, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.white, + width: 1.0, + ), + boxShadow: [ + BoxShadow( + color: Color(0x66000000), + offset: Offset(0, 4), + blurRadius: 4.0, + ), + ], + ), + ), + sizedBoxWidth(20.w), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.clubs); + }, + child: Column( + children: [ + text16400white("10"), + sizedBoxHeight(6.h), + text12400whiteblur("Clubs") + ], + ), + ), + ], + ), + sizedBoxHeight(20.h), + ], + ), + ], + ), + ), + ), + ], + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(30.h), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Get.toNamed(RouteName.editProfile); + }, + child: Container( + height: 40.h, + width: 170.w, + decoration: BoxDecoration( + color: Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular(30.r), + ), + child: Center( + child: text16w400_FCFCFC("Follow")), + ), + ), + GestureDetector( + onTap: () { + // Get.toNamed(RouteName.shareProfile); + }, + child: commonGlassUI( + width: 170.w, + height: 40.h, + + opacity1: 0.05, + opacity2: 0.07, + borderRadius: + BorderRadius.circular(30.r), + mainOpacity: 1, + customWidget: Center( + child: text16w400_FCFCFC("Message"), + ), + // border: 1, + ), + ) + ], + ), + sizedBoxHeight(30.h), + text18w700white("About"), + sizedBoxHeight(10.h), + text14400white( + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), + sizedBoxHeight(25.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/Group 58645.png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + text14400whiteblur( + "Elm street london, United Kingdom"), + ], + ), + sizedBoxHeight(20.h), + Row( + children: [ + commonContainer( + width: 25.w, + height: 25.h, + opacity1: 0.26, + opacity2: 0.26, + borderwidth: 0.5, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + "assets/images/png/Vector (4).png", + height: 12.h, + width: 12.w, + )), + ), + sizedBoxWidth(12.w), + text14400whiteblur( + 'Rowing, Football, Swimming'), + // interestText + // text14400whiteblur(getEditProfileIndi! + // .data!.interest! + // .join(', ')), + // text14400whiteblur( + // "Rowing, Football, Swimming"), + ], + ), + sizedBoxHeight(25.h), + // commonGlassUI( + // width: double.infinity, + // height: 135.h, + // borderRadius: BorderRadius.circular(10), + // customWidget: Padding( + // padding: EdgeInsets.symmetric( + // vertical: 12.h, horizontal: 16.w), + // child: Column( + // children: [ + // Row( + // children: [ + // text16w700white("Badges"), + // Spacer(), + // GestureDetector( + // onTap: () { + // Get.toNamed(RouteName.badges); + // }, + // child: text12400white("View more")) + // ], + // ), + // sizedBoxHeight(8.h), + // Row( + // mainAxisAlignment: + // MainAxisAlignment.spaceBetween, + // children: [ + // Image.asset( + // "assets/images/png/Frame 1000004056.png", + // height: 70.h, + // width: 74.w, + // ), + // Image.asset( + // "assets/images/png/Frame 1000004056.png", + // height: 70.h, + // width: 74.w, + // ), + // Image.asset( + // "assets/images/png/Frame 1000004056.png", + // height: 70.h, + // width: 74.w, + // ), + // Image.asset( + // "assets/images/png/Frame 1000004056.png", + // height: 70.h, + // width: 74.w, + // ), + // ], + // ), + // ], + // ), + // ), + // // border: 1 + // ), + ], + ), + ), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + text18w700white("Timeline"), + Spacer(), + InkWell( + onTap: () { + Get.toNamed(RouteName.addtimeline); + }, + child: Image.asset( + "assets/images/png/iconamoon_edit-thin.png", + height: 20.h, + width: 20.w, + ), + ) + ], + ), + sizedBoxHeight(20.h), + SizedBox( + height: 300.h, + child: ListView.builder( + shrinkWrap: true, + itemCount: timeline.length, + itemBuilder: (context, index) { + return commonTimelineCard( + imagePath: timeline[index] + ["imagePath"], + title: timeline[index]["title"]); + }, + )), + sizedBoxHeight(30.h), + Row( + children: [ + text16w700white( + "Certifications/Qualifications"), + Spacer(), + InkWell( + onTap: () { + Get.toNamed(RouteName.certificate); + }, + child: text12400white("View more")), + ], + ), + sizedBoxHeight(20.h), + SizedBox( + height: 85.h, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: certificationData.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(right: 20.w), + child: certificationCardTile( + imagePath: + certificationData[index] + ["imagePath"], + title: certificationData[index] + ["title"], + subtitle: certificationData[index] + ["subtitle"], + date: certificationData[index] + ["date"]), + ); + }, + ), + ), + sizedBoxHeight(30.h), + text18w400white("Subgroups"), + ]), + ), + sizedBoxHeight(20.h), + SizedBox( + height: 190.h, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.only(left: 16.w), + itemCount: cardtile.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(right: 20.w), + child: profilecardtile( + imagePath: cardtile[index]["imagePath"], + title: cardtile[index]["title"]), + ); + }, + ), + ), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.only(left: 16.w), + child: text18w700white("Activity"), + ), + normalcardtile( + profileImg: 'assets/images/png/Ellipse 48.png', + title: 'Jocelyn Dokidis', + mainImg: 'assets/images/png/Rectangle 46.png', + containerTitle: [ + 'Race', + 'Swimming', + 'Events', + 'Marathon', + 'Events' + ]), + sizedBoxHeight(120.h), + ], + ), + ), + ), + Positioned.fill( + top: 40.h, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + children: [ + sizedBoxHeight(20.h), + Row( + children: [ + Spacer(), + commonContainer( + width: 40.w, + height: 40.h, + borderwidth: 0.5, + boxShape: BoxShape.circle, + opacity1: 0.5, + opacity2: 0.6, + customWidget: PopupMenuButton( + surfaceTintColor: const Color(0xFF222935), + constraints: + BoxConstraints.tightFor(width: 200.w), + offset: const Offset(0, 50), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () { + Get.toNamed(RouteName.shareProfile); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Share profile', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/share.png", + height: 17.h, + width: 17.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Report user', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/Vector (5).png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + Text( + 'Block user', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + const Spacer(), + Image.asset( + "assets/images/png/blocked.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Center( + child: Image.asset( + 'assets/images/png/Group 1000004071.png', + height: 20.h, + width: 20.w, + )), + ), + ), + ], + ), + ], + ), + ), + ), + ]); + } + return Container(); + })); + } + + Widget commonTimelineCard( + {required String imagePath, required String title}) { + return Row( + children: [ + Container( + width: 10, + height: 170.h, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 50.h, + child: Container( + height: 11.h, + width: 11.w, + decoration: BoxDecoration( + color: Colors.white, shape: BoxShape.circle)), + ), + Positioned( + right: 3.w, + child: Container( + width: 1.w, + height: 170.h, + decoration: BoxDecoration(color: Colors.white), + ), + ), + ], + ), + ), + sizedBoxWidth(20.w), + Expanded( + child: Column( + children: [ + commonGlassUI( + width: double.infinity, + height: 145.h, + borderRadius: BorderRadius.circular(10.r), + customWidget: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + CircleAvatar( + radius: 10.r, + backgroundImage: AssetImage(imagePath), + ), + sizedBoxWidth(8.w), + text14700white(title) + ], + ), + sizedBoxHeight(10.h), + text12700white("Team captain"), + sizedBoxHeight(8.h), + text12400white("April 2023 - May 2024"), + sizedBoxHeight(10.h), + text10400whiteblur( + "Lorem Ipsum is simply dummy text of the printing and typesetting industry.") + ], + ), + ), + // border: 1 + ), + ], + ), + ), + ], + ); + } + + Widget normalcardtile({ + required String profileImg, + required String title, + required String mainImg, + required List containerTitle, + }) { + var mainImage = 'assets/images/png/uiw_like-o.png'.obs; + void updateImage(String reaction) { + if (reaction == 'like') { + mainImage.value = 'assets/images/png/f7_hand-thumbsup.png'; + } else if (reaction == 'heart') { + mainImage.value = 'assets/images/png/heart 2.png'; + } else if (reaction == 'party') { + mainImage.value = 'assets/images/png/party-popper 2.png'; + } + } + + return Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircleAvatar( + foregroundImage: AssetImage(profileImg), + radius: 25.r, + ), + sizedBoxWidth(12.w), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16w400_FCFCFC(title), + sizedBoxHeight(5.h), + Row( + children: [ + Image.asset( + 'assets/images/png/community 1 (traced).png', + height: 14.w, + width: 14.w, + ), + sizedBoxWidth(7.w), + text12w400_FCFCFC('Active alliance network'), + sizedBoxWidth(7.w), + Icon( + Icons.circle, + color: Color(0xFFFCFCFC), + size: 4.sp, + ), + sizedBoxWidth(6.w), + text12w400_FCFCFC('1 Hour ago'), + ], + ) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: BoxConstraints.tightFor(width: 176.w), + offset: Offset(0, 50), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Report Post', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/Vector (5).png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Share post', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/share.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + children: [ + Text( + 'Pin', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + fontWeight: FontWeight.w800, + fontFamily: "Nunito Sans", + ), + ), + Spacer(), + Image.asset( + "assets/images/png/f7_pin-fill (2).png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Image.asset( + 'assets/images/png/Group 1000004071.png', + width: 16.w, + height: 18.h, + ), + ), + sizedBoxWidth(5.w) + ], + ), + ), + sizedBoxHeight(20.h), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.postdetailsScreen); + }, + child: Container( + height: 163.h, + width: double.infinity, + child: Image.asset( + mainImg, + fit: BoxFit.cover, + ), + )), + sizedBoxHeight(20.h), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Column(children: [ + SizedBox( + height: 30.h, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: containerTitle.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(right: 12.w), + child: GestureDetector( + onTap: () { + // Get.toNamed(RouteName.cyclescreen); + }, + child: containertile(text: containerTitle[index])), + ); + }, + ), + ), + sizedBoxHeight(20.h), + text16w400_FCFCFC( + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s . . ."), + Row(children: [ + stackReaction(number: '20', containerImages: [ + 'assets/images/png/f7_hand-thumbsup.png', + 'assets/images/png/heart 2.png', + 'assets/images/png/party-popper 2.png' + ]), + Spacer(), + commonContainer( + width: 30.w, + height: 30.h, + opacity1: 0.2, + opacity2: 0.2, + borderwidth: 0.43, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + 'assets/images/png/Frame 1000004088.png', + height: 13.h, + width: 13.w, + ), + ), + ), + sizedBoxWidth(12.w), + text14w400_FCFCFC('20'), + sizedBoxWidth(20.w), + commonContainer( + width: 30.w, + height: 30.h, + opacity1: 0.2, + opacity2: 0.2, + borderwidth: 0.43, + boxShape: BoxShape.circle, + customWidget: Center( + child: Image.asset( + 'assets/images/png/Vector (1).png', + height: 12.h, + width: 12.w, + ), + ), + ), + sizedBoxWidth(12.w), + text14w400_FCFCFC('10'), + ]), + sizedBoxHeight(30.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx(() { + return ReactionButton( + onReactionChanged: (reaction) { + updateImage(reaction?.value ?? 'like'); + debugPrint('Selected value: ${reaction?.value}'); + }, + reactions: ?>[ + Reaction( + value: 'like', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + icon: _buildReactionsIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + ), + Reaction( + value: 'heart', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/heart 2.png'), + icon: _buildReactionsIcon( + 'assets/images/png/heart 2.png'), + ), + Reaction( + value: 'party', + previewIcon: _buildReactionsPreviewIcon( + 'assets/images/png/party-popper 2.png'), + icon: _buildReactionsIcon( + 'assets/images/png/party-popper 2.png'), + ), + ], + selectedReaction: Reaction( + value: 'like', + icon: _buildReactionsIcon( + 'assets/images/png/f7_hand-thumbsup.png'), + ), + boxColor: Colors.white, + boxElevation: 9, + boxRadius: 30, + itemsSpacing: 8, + itemScale: 0.4, + itemSize: Size(45, 45), + boxPadding: EdgeInsets.all(8), + boxAnimationDuration: Duration(milliseconds: 200), + itemAnimationDuration: Duration(milliseconds: 500), + hoverDuration: Duration(milliseconds: 700), + // toggle: false, + + child: _buildReactionsIcon(mainImage.value), + ); + }) + ], + ), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.postdetailsScreen); + }, + child: Column( + children: [ + Image.asset( + 'assets/images/png/Frame 1000004088.png', + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Comment') + ], + ), + ), + Column( + children: [ + Image.asset( + 'assets/images/png/Frame 1000004089.png', + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Save') + ], + ) + ], + ) + ]), + ), + ], + ); + } + + Widget certificationCardTile({ + required String imagePath, + required String title, + required String subtitle, + required String date, + }) { + return commonGlassUI( + width: 270.w, + height: 70.h, + borderRadius: BorderRadius.circular(10.r), + customWidget: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + height: 40.h, + width: 57.w, + child: Image.asset( + imagePath, + fit: BoxFit.cover, + ), + ), + sizedBoxWidth(10.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + text12400white(title), + sizedBoxHeight(5.h), + text9400white(subtitle), + sizedBoxHeight(5.h), + text9400white(date) + ], + ), + ), + ], + ), + ), + // border: 1 + ); + } + + Widget _buildReactionsPreviewIcon(String assetPath) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Image.asset( + assetPath, + height: 40.h, + width: 40.w, + ), + ); + } + + Widget _buildReactionsIcon(String assetPath) { + return Column( + children: [ + Image.asset( + assetPath, + height: 19.h, + width: 19.w, + ), + sizedBoxHeight(8.h), + text11w400_FCFCFC('Like') + ], + ); + } + + Widget containertile({required String text}) { + return commonContainer( + width: 100.w, + height: 30.h, + borderRadius: BorderRadius.circular(30.r), + borderColor: Color(0xFFD90B2E), + borderwidth: 0.9, + customWidget: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: Center(child: text14w400_FCFCFC(text)), + )); + } + + Widget profilecardtile({required String imagePath, required String title}) { + return Column( + children: [ + Container( + height: 109.h, + width: 100.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + ), + child: Image.asset(imagePath), + ), + sizedBoxHeight(10.h), + SizedBox(width: 100.w, child: text12w700_FCFCFC(title)), + ], + ); + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/ViewModel/GuestProfileApi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/ViewModel/GuestProfileApi.dart new file mode 100644 index 0000000..824147b --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/ViewModel/GuestProfileApi.dart @@ -0,0 +1,73 @@ + import 'dart:async'; +import 'dart:developer'; + +import 'package:regroup/Common/api_urls.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GetGuestFollowers.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GetGuestFollowing.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GuestGetProfileDataBus.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Model/GuestGetProfileDataIndi.dart'; + + +GuestGetProfileDataIndi? guestGetProfileInd; +GuestGetProfileDataBus? guestGetProfileBus; + +GetGuestFollowers? getguestfollowersobj; +GetGuestFollowing? getguestfollowingobj; + + +class GuestProfileApi { + GuestProfileApi(); + + +Future> getGuestProfileInd(updata) async { + final response = await NetworkApiServices().getApi( + "${ApiUrls.getGuestProfileInd}?guest_user_id=$updata", + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + guestGetProfileInd = GuestGetProfileDataIndi.fromJson(response.data); + log(guestGetProfileInd!.data.toString()); + } + return response; + } + + Future> getGuestProfileBus(updata) async { + final response = await NetworkApiServices().getApi( + "${ApiUrls.getGuestProfileBus}?guest_user_id=$updata", + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + guestGetProfileBus = GuestGetProfileDataBus.fromJson(response.data); + log(guestGetProfileBus!.data.toString()); + } + return response; + } + + Future> getGuestfollowers(gestUserid ,guestupdata , {required StreamController streamController}) async { + final response = await NetworkApiServices().getApi( + "${ApiUrls.getGuestfollowers}?guest_user_id=$gestUserid&search=$guestupdata", + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + getguestfollowersobj = GetGuestFollowers.fromJson(response.data); + if (!streamController.isClosed) streamController.sink.add(getguestfollowersobj!); + log(guestGetProfileInd!.data.toString()); + } + return response; + } + + Future> getGuestfollowing(gestUserid ,guestupdata , {required StreamController streamController}) async { + final response = await NetworkApiServices().getApi( + "${ApiUrls.getGuestfollowing}?guest_user_id=$gestUserid&search=$guestupdata", + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + getguestfollowingobj = GetGuestFollowing.fromJson(response.data); + if (!streamController.isClosed) streamController.sink.add(getguestfollowingobj!); + log(guestGetProfileInd!.data.toString()); + } + return response; + } +} \ No newline at end of file diff --git a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart index ecbf9f0..0f4d4c7 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart @@ -1,12 +1,22 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:regroup/Common/CommonTabBar.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followersModel.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followingModel.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; class MyNetwork extends StatefulWidget { const MyNetwork({super.key}); @@ -61,41 +71,105 @@ class _MyNetworkState extends State { ]) ])); } +} - Widget followersTab() { - List followersData = [ - { - "imagePath": "assets/images/png/Ellipse 52.png", - "title": "Iron titans fitness crew", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 48.png", - "title": "Body blitz brigade", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 43.png", - "title": "Fit fusion squad", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 37.png", - "title": "Power pulse posse", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 52.png", - "title": "Iron titans fitness crew", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 48.png", - "title": "Body blitz brigade", - "subtitle": "Lorem ipsum dummy text", - }, - ]; +class followersTab extends StatefulWidget { + const followersTab({super.key}); + @override + State createState() => _followersTabState(); +} + +class _followersTabState extends State { + StreamController searchcontroller = StreamController(); + + @override + void initState() { + var updata = ""; + Profilegetmethod().getFollowers(updata, streamController: searchcontroller); + + // TODO: implement initState + super.initState(); + } + + @override + void dispose() { + searchcontroller.close(); + super.dispose(); + } + + int? blockid; + int? removeid; + + RemoveUploadata() async { + utils.loader(); + Map updata = { + "iam_principal_xid": removeid, + }; + final data = await Profilepostmethod().postRemoveuser(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("block done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("block not done"); + return utils.showToast(data.message); + } + } + + BlockUploadata() async { + utils.loader(); + Map updata = { + "blocked_iam_principal_xid": blockid, + }; + final data = await Profilepostmethod().postBlockuser(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("block done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("block not done"); + return utils.showToast(data.message); + } + } + + List followersData = [ + { + "imagePath": "assets/images/png/Ellipse 52.png", + "title": "Iron titans fitness crew", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 48.png", + "title": "Body blitz brigade", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 43.png", + "title": "Fit fusion squad", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 37.png", + "title": "Power pulse posse", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 52.png", + "title": "Iron titans fitness crew", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 48.png", + "title": "Body blitz brigade", + "subtitle": "Lorem ipsum dummy text", + }, + ]; + + @override + Widget build(BuildContext context) { return Column( children: [ sizedBoxHeight(25.h), @@ -113,298 +187,565 @@ class _MyNetworkState extends State { ), ), ), + texttype: TextInputType.text, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + Profilegetmethod() + .getFollowers(value, streamController: searchcontroller); + }, hintText: "Search people", ), ), - ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followersData.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: - EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - CircleAvatar( - backgroundImage: - AssetImage(followersData[index]["imagePath"]), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16w400_FCFCFC(followersData[index]["title"]), - sizedBoxHeight(4.h), - text12w400_FCFCFC_blur( - followersData[index]["subtitle"]) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, + sizedBoxHeight(20.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return Expanded( + child: Center(child: CircularProgressIndicator())); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return followersobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: ScrollPhysics(), + shrinkWrap: true, + itemCount: followersobj!.data!.length, + separatorBuilder: (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followersobj!.data![index].follower! + .profilePhoto == + null || + followersobj!.data![index].follower! + .profilePhoto!.isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, ) - ], - ), + : CircleAvatar( + backgroundImage: NetworkImage( + followersobj!.data![index] + .follower!.profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followersobj!.data![index].follower! + .fullName == + null || + followersobj! + .data![index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(followersobj! + .data![index] + .follower! + .fullName!), + sizedBoxHeight(4.h), + followersobj!.data![index].follower! + .userName == + null || + followersobj! + .data![index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur("regroup") + : text12w400_FCFCFC_blur(followersobj! + .data![index].follower!.userName!) + ], ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: + BoxConstraints.tightFor(width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: () async { + setState(() { + removeid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower!.id == + removeid); + RemoveUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Remove user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_delete-28-regular.png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-regular.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () async { + setState(() { + blockid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower!.id == + blockid); + BlockUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Block user"), + Spacer(), + Image.asset( + "assets/images/png/blockchat.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], ), - ), - )), - ], - ), - ) - ], - ); + ) + ], + ); + }, + ); + } }, ), ], ); } - Widget followingTab() { - List followingData = [ - { - "imagePath": "assets/images/png/Ellipse 52.png", - "title": "Iron titans fitness crew", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 48.png", - "title": "Body blitz brigade", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 43.png", - "title": "Fit fusion squad", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 37.png", - "title": "Power pulse posse", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 52.png", - "title": "Iron titans fitness crew", - "subtitle": "Lorem ipsum dummy text", - }, - { - "imagePath": "assets/images/png/Ellipse 48.png", - "title": "Body blitz brigade", - "subtitle": "Lorem ipsum dummy text", - }, - ]; - - return Column( - children: [ - sizedBoxHeight(25.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", - height: 23, - width: 23, - ), - ), - ), - hintText: "Search people", - ), + Widget _buildNoDataBody(context) { + return Expanded( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], ), - ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followingData.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: - EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - CircleAvatar( - backgroundImage: - AssetImage(followingData[index]["imagePath"]), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16w400_FCFCFC(followingData[index]["title"]), - sizedBoxHeight(4.h), - text12w400_FCFCFC_blur( - followingData[index]["subtitle"]) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 12.w), - child: Row( - children: [ - text14400white("Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), - ) - ], - ); - }, - ), - ], + ), + ); + } +} + +class followingTab extends StatefulWidget { + const followingTab({super.key}); + + @override + State createState() => _followingTabState(); +} + +class _followingTabState extends State { + StreamController searchcontroller = StreamController(); + + List followingData = [ + { + "imagePath": "assets/images/png/Ellipse 52.png", + "title": "Iron titans fitness crew", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 48.png", + "title": "Body blitz brigade", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 43.png", + "title": "Fit fusion squad", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 37.png", + "title": "Power pulse posse", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 52.png", + "title": "Iron titans fitness crew", + "subtitle": "Lorem ipsum dummy text", + }, + { + "imagePath": "assets/images/png/Ellipse 48.png", + "title": "Body blitz brigade", + "subtitle": "Lorem ipsum dummy text", + }, + ]; + + @override + void initState() { + // TODO: implement initState + + var updata = ""; + Profilegetmethod().getFollowing(updata, streamController: searchcontroller); + + super.initState(); + } + + @override + void dispose() { + searchcontroller.close(); + super.dispose(); + } + + Uploadata() async { + utils.loader(); + Map updata = { + "following_iam_principal_xid": unfollowid, + }; + final data = await Profilepostmethod().postunfollowuser(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("unfollow done"); + // setState(() { + // // Assuming followingobj is a list of items, remove the item with matching user ID + // followingobj!.data!.removeWhere((item) => item.following!.id == userid); + // }); + return utils.showToast(data.message); + } else { + Get.back(); + print("unfollow not done"); + return utils.showToast(data.message); + } + } + + int? unfollowid; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), + ), + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // Onboard().postGroupsearch({"search": value}, + // streamController: searchcontroller); + // searchGroups(value!); + Profilegetmethod() + .getFollowing(value, streamController: searchcontroller); + }, + ), + ), + sizedBoxHeight(20.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return Expanded( + child: Center(child: CircularProgressIndicator())); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return followingobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: ScrollPhysics(), + shrinkWrap: true, + itemCount: followingobj!.data!.length, + separatorBuilder: (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return + // Column( + // children: [ + // Followinglist( + // imagePath: followingobj?.data?[index] + // .following?.profilePhoto ?? + // '', + // title: followingobj! + // .data?[index].following?.fullName ?? + // '', + // subtitle: followingobj! + // .data?[index].following?.userName ?? + // '', + // unfollowontap: (id) => Uploadata(id), + // unfollowindex: followingobj! + // .data![index].following!.id!, + // ), + // if (index != followingobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followingobj!.data![index].following! + .profilePhoto == + null || + followingobj!.data![index].following! + .profilePhoto!.isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followingobj!.data![index] + .following!.profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followingobj!.data![index].following! + .fullName == + null || + followingobj!.data![index] + .following!.fullName!.isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(followingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + followingobj!.data![index].following! + .userName == + null || + followingobj!.data![index] + .following!.userName!.isEmpty + ? text12w400_FCFCFC_blur("regroup") + : text12w400_FCFCFC_blur(followingobj! + .data![index] + .following! + .userName!) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: + BoxConstraints.tightFor(width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () async { + setState(() { + unfollowid = followingobj! + .data![index] + .following! + .id ?? + 0; + // followingobj!.data!.removeAt(index); + followingobj!.data! + .removeWhere((item) => + item.following!.id == + unfollowid); + Uploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Unfollow user"), + Spacer(), + Image.asset( + "assets/images/png/Black1323e.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-22.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ), + ], + ); + }, + ); + } + }, + ), + ], + ); + } + + Widget _buildNoDataBody(context) { + return Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], + ), ); } } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 3999c62..b0e2143 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -39,8 +39,8 @@ import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/View/E import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Followers/Followers.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Following/Following.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Business/ProfileTabBusGuest.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/Individual/ProfileTabIndGuest.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/View/Business/ProfileTabBusGuest.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/View/Individual/ProfileTabIndGuest.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/My%20Network/MyNetwork.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Settings/AccountSessions.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart'; -- 2.34.1 From d3618b1535bb8b3c8796d0c78e95af9839292637 Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Mon, 22 Jul 2024 11:14:34 +0530 Subject: [PATCH 02/21] api integratrd for block,timeline,delete ,logout delete timeline ,sungroups,edit timeline half done --- lib/Common/CommonWidget.dart | 2 +- lib/Common/api_urls.dart | 20 + .../EditProfile/Model/GetEditProfileIndi.dart | 165 +- .../EditProfile/View/ProfileTab.dart | 521 +++++- .../EditProfile/ViewModel/EditProfileApi.dart | 8 + .../ProfileTab/Following/Following.dart | 20 - .../ProfileTab/Model/editTimelineModel.dart | 116 ++ .../Model/timelineabilityModel.dart | 51 + .../ProfileTab/Settings/AccountSetting.dart | 55 +- .../ProfileTab/Settings/DeleteAccount.dart | 158 +- .../ProfileTab/Settings/Settings.dart | 42 +- .../Settings/View/BlockedUsers.dart | 406 ++++- .../Settings/ViewModel/BlockedUserApi.dart | 55 +- .../ProfileTab/TimeLine/AddTimeline.dart | 1529 +++++++++++++++-- .../view_model/gettimelineability.dart | 32 + .../view_model/profileGetmethod.dart | 15 + .../view_model/profilePostmethod.dart | 137 ++ lib/Login/View/loginscreen.dart | 650 +++---- lib/Utils/Common/CommonDropdown.dart | 9 +- 19 files changed, 3310 insertions(+), 681 deletions(-) create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart diff --git a/lib/Common/CommonWidget.dart b/lib/Common/CommonWidget.dart index e6cceea..c0ed6d9 100644 --- a/lib/Common/CommonWidget.dart +++ b/lib/Common/CommonWidget.dart @@ -171,7 +171,7 @@ Future datePicker( ); if (picked != null) { - controller.text = DateFormat('dd-MM-yyyy').format(picked); + controller.text = DateFormat('yyyy-MM-dd').format(picked); } } diff --git a/lib/Common/api_urls.dart b/lib/Common/api_urls.dart index 057a17c..591351c 100644 --- a/lib/Common/api_urls.dart +++ b/lib/Common/api_urls.dart @@ -59,6 +59,26 @@ class ApiUrls { static const postchangepassverify = "${baseUrl}verify-update-password-otp"; + static const gettimelineabilitylist = "${baseUrl}list-of-abilities"; + + static const posttimeline = "${baseUrl}create-timeline"; + + static const postaccountvisibility = "${baseUrl}account-visibility"; + + static const postdeleteaccount = "${baseUrl}delete-my-account"; + + static const postlogoutaccount = "${baseUrl}logout"; + + static const getedittimeline = "${baseUrl}get-timeline-data"; + + static const postedittimeline = "${baseUrl}update-timeline"; + + static const postremovetimeline = "${baseUrl}delete-timeline"; + + + + + static const postnotification = "${baseUrl}update-notification-settings"; diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart index 9558581..2422a2a 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart @@ -29,6 +29,7 @@ class Data { int? id; String? userName; String? fullName; + String? profileImage; String? gender; String? dateOfBirth; List? interest; @@ -39,11 +40,16 @@ class Data { String? weight; String? battingAverage; Follows? follows; + List? timelines; + int? accountVisibility; + List? myJoinedSubgroups; + Data( {this.id, this.userName, this.fullName, + this.profileImage, this.gender, this.dateOfBirth, this.interest, @@ -53,12 +59,17 @@ class Data { this.height, this.weight, this.battingAverage, - this.follows}); + this.follows, + this.timelines, + this.accountVisibility, + this.myJoinedSubgroups + }); Data.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; + profileImage = json['profile_image']; gender = json['gender']; dateOfBirth = json['date_of_birth']; if (json['interest'] != null) { @@ -75,6 +86,19 @@ class Data { battingAverage = json['batting_average']; follows = json['follows'] != null ? new Follows.fromJson(json['follows']) : null; + if (json['timelines'] != null) { + timelines = []; + json['timelines'].forEach((v) { + timelines!.add(new Timelines.fromJson(v)); + }); + } + accountVisibility = json['account_visibility']; + if (json['my_joined_subgroups'] != null) { + myJoinedSubgroups = []; + json['my_joined_subgroups'].forEach((v) { + myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); + }); + } } Map toJson() { @@ -82,6 +106,7 @@ class Data { data['id'] = this.id; data['user_name'] = this.userName; data['full_name'] = this.fullName; + data['profile_image'] = this.profileImage; data['gender'] = this.gender; data['date_of_birth'] = this.dateOfBirth; if (this.interest != null) { @@ -95,6 +120,14 @@ class Data { data['batting_average'] = this.battingAverage; if (this.follows != null) { data['follows'] = this.follows!.toJson(); + } + if (this.timelines != null) { + data['timelines'] = this.timelines!.map((v) => v.toJson()).toList(); + } + data['account_visibility'] = this.accountVisibility; + if (this.myJoinedSubgroups != null) { + data['my_joined_subgroups'] = + this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); } return data; } @@ -119,6 +152,77 @@ class Interest { } } +class Timelines { + int? id; + String? clubName; + String? roleName; + String? teamName; + String? startDate; + String? endDate; + String? abilitiesXids; + List? abilities; + + Timelines( + {this.id, + this.clubName, + this.roleName, + this.teamName, + this.startDate, + this.endDate, + this.abilitiesXids, + this.abilities}); + + Timelines.fromJson(Map json) { + id = json['id']; + clubName = json['club_name']; + roleName = json['role_name']; + teamName = json['team_name']; + startDate = json['start_date']; + endDate = json['end_date']; + abilitiesXids = json['abilities_xids']; + if (json['abilities'] != null) { + abilities = []; + json['abilities'].forEach((v) { + abilities!.add(new Abilities.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['club_name'] = this.clubName; + data['role_name'] = this.roleName; + data['team_name'] = this.teamName; + data['start_date'] = this.startDate; + data['end_date'] = this.endDate; + data['abilities_xids'] = this.abilitiesXids; + if (this.abilities != null) { + data['abilities'] = this.abilities!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Abilities { + int? id; + String? name; + + Abilities({this.id, this.name}); + + Abilities.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + class Follows { int? following; int? followers; @@ -137,3 +241,62 @@ class Follows { return data; } } + +class MyJoinedSubgroups { + int? id; + int? iamPrincipalXid; + int? manageGroupXid; + int? manageSubGroupXid; + SubGroupData? subGroupData; + + MyJoinedSubgroups( + {this.id, + this.iamPrincipalXid, + this.manageGroupXid, + this.manageSubGroupXid, + this.subGroupData}); + + MyJoinedSubgroups.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + manageGroupXid = json['manage_group_xid']; + manageSubGroupXid = json['manage_sub_group_xid']; + subGroupData = json['sub_group_data'] != null + ? new SubGroupData.fromJson(json['sub_group_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['iam_principal_xid'] = this.iamPrincipalXid; + data['manage_group_xid'] = this.manageGroupXid; + data['manage_sub_group_xid'] = this.manageSubGroupXid; + if (this.subGroupData != null) { + data['sub_group_data'] = this.subGroupData!.toJson(); + } + return data; + } +} + +class SubGroupData { + int? id; + String? title; + String? subGroupImage; + + SubGroupData({this.id, this.title, this.subGroupImage}); + + SubGroupData.fromJson(Map json) { + id = json['id']; + title = json['title']; + subGroupImage = json['sub_group_image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['sub_group_image'] = this.subGroupImage; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index 6267de2..c4167f8 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -5,13 +5,17 @@ import 'package:get/get.dart'; import 'package:regroup/Common/CommonBottomNavigationBar.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/MainScreen.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:intl/intl.dart'; class ProfileTab extends StatefulWidget { const ProfileTab({super.key}); @@ -124,6 +128,25 @@ class _ProfileTabState extends State { } } + int? timelineremoveid; + + RemoveTimelineUploadata() async { + utils.loader(); + Map updata = { + "timeline_id": timelineremoveid, + }; + final data = await Profilepostmethod().postRemoveTimeline(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("block done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("block not done"); + return utils.showToast(data.message); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -485,23 +508,6 @@ class _ProfileTabState extends State { ], ), ), - SizedBox( - height: 190.h, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.only(left: 16.w), - itemCount: cardtile.length, - itemBuilder: (context, index) { - return Padding( - padding: EdgeInsets.only(right: 20.w), - child: profilecardtile( - imagePath: cardtile[index]["imagePath"], - title: cardtile[index]["title"]), - ); - }, - ), - ), sizedBoxHeight(20.h), Padding( padding: EdgeInsets.symmetric(horizontal: 16.w), @@ -514,7 +520,11 @@ class _ProfileTabState extends State { Spacer(), InkWell( onTap: () { - Get.toNamed(RouteName.addtimeline); + Get.toNamed(RouteName.addtimeline, + arguments: { + 'id': 0, + 'edit': false, + }); }, child: Image.asset( "assets/images/png/iconamoon_edit-thin.png", @@ -525,23 +535,339 @@ class _ProfileTabState extends State { ], ), sizedBoxHeight(20.h), - SizedBox( - height: 300.h, - child: ListView.builder( - shrinkWrap: true, - itemCount: timeline.length, - itemBuilder: (context, index) { - return commonTimelineCard( - imagePath: timeline[index] - ["imagePath"], - title: timeline[index] - ["title"]); - }, - )), + getEditProfileIndi!.data!.timelines!.isEmpty + ? Center( + child: + text18w700white("Add timeline")) + : SizedBox( + height: 200.h, + child: ListView.builder( + shrinkWrap: true, + itemCount: getEditProfileIndi! + .data!.timelines!.length, + itemBuilder: (context, index) { + DateTime startDate = + DateTime.parse( + getEditProfileIndi! + .data! + .timelines![index] + .startDate!); + DateTime endDate = + DateTime.parse( + getEditProfileIndi! + .data! + .timelines![index] + .endDate!); + + String formattedStartDate = + DateFormat('dd MMMM yyyy') + .format(startDate); + String formattedEndDate = + DateFormat('dd MMMM yyyy') + .format(endDate); + + // Combine formatted dates + String startToEnd = + '$formattedStartDate - $formattedEndDate'; + + var timeline = + getEditProfileIndi!.data! + .timelines![index]; + + List> + abilities = + timeline.abilities! + .map((ability) => { + 'id': ability.id, + 'name': + ability.name, + }) + .toList(); + return + // commonTimelineCard( + // imagePath: getEditProfileIndi + // ?.data + // ?.profileImage ?? + // '', + // title: getEditProfileIndi! + // .data! + // .timelines![index] + // .clubName!, + // role: getEditProfileIndi! + // .data! + // .timelines![index] + // .roleName!, + // teamname: getEditProfileIndi! + // .data! + // .timelines![index] + // .teamName!, + // abilities: abilities, + // id: getEditProfileIndi!.data! + // .timelines![index].id, + // starttoend: startToEnd, + // ); + Row( + children: [ + Container( + width: 10, + height: 170.h, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 50.h, + child: Container( + height: 11.h, + width: 11.w, + decoration: BoxDecoration( + color: Colors + .white, + shape: BoxShape + .circle)), + ), + Positioned( + right: 3.w, + child: Container( + width: 1.w, + height: 170.h, + decoration: + BoxDecoration( + color: Colors + .white), + ), + ), + ], + ), + ), + sizedBoxWidth(20.w), + Expanded( + child: Column( + children: [ + commonGlassUI( + width: + double.infinity, + height: 155.h, + borderRadius: + BorderRadius + .circular( + 10.r), + customWidget: + Padding( + padding: EdgeInsets + .only( + left: + 16.w, + right: + 16.w, + top: + 10.h), + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Row( + children: [ + getEditProfileIndi?.data?.profileImage == null || getEditProfileIndi!.data!.profileImage!.isEmpty + ? CircleAvatar(radius: 10.r, backgroundImage: AssetImage('assets/images/png/cimg1.png')) + : CircleAvatar(radius: 10.r, backgroundImage: NetworkImage(getEditProfileIndi!.data!.profileImage!)), + sizedBoxWidth( + 8.w), + getEditProfileIndi!.data!.timelines![index].clubName == null || getEditProfileIndi!.data!.timelines![index].clubName!.isEmpty + ? text14700white('Regroup') + : text14700white(getEditProfileIndi!.data!.timelines![index].clubName!) + ], + ), + InkWell( + onTap: + () { + // setState( + // () { + // timelineremoveid = + // getEditProfileIndi!.data!.timelines![index].id ?? 0; + // getEditProfileIndi!.data!.timelines!.removeWhere((item) => + // item.id! == + // timelineremoveid); + // // .removeAt(index); + // RemoveTimelineUploadata(); + // }); + + Get.toNamed(RouteName.addtimeline, arguments: { + 'id': getEditProfileIndi!.data!.timelines![index].id, + 'edit': true, + }); + }, + child: + SizedBox( + width: + 20.w, + height: + 20.h, + child: + Image.asset( + "assets/images/png/iconamoon_edit-thin.png", + height: + 14.h, + width: + 14.w, + ), + ), + ) + ], + ), + sizedBoxHeight( + 10.h), + getEditProfileIndi!.data!.timelines![index].roleName == + null || + getEditProfileIndi! + .data! + .timelines![ + index] + .roleName! + .isEmpty + ? text12700white( + 'regroup') + : text12700white(getEditProfileIndi! + .data! + .timelines![ + index] + .roleName!), + sizedBoxHeight( + 10.h), + getEditProfileIndi!.data!.timelines![index].teamName == + null || + getEditProfileIndi! + .data! + .timelines![ + index] + .teamName! + .isEmpty + ? text12700white( + 'regroup') + : text12700white(getEditProfileIndi! + .data! + .timelines![ + index] + .teamName!), + sizedBoxHeight( + 10.h), + + startToEnd + .isEmpty + ? text12400white( + 'No date') + : text12400white( + startToEnd), + sizedBoxHeight( + 10.h), + + abilities + .isEmpty + ? text10400whiteblur( + 'No data') + : + // ListView.builder( + // shrinkWrap: true, + // scrollDirection: Axis.horizontal, + // padding: EdgeInsets.only(left: 16.w), + // itemCount: abilities.length, + // itemBuilder: (context, index) { + // return + // text10400whiteblur(abilities.toString()); + + // }, + // ), + + Container( + height: + 30.h, // Adjust the height as needed + child: + ListView.builder( + shrinkWrap: + true, + scrollDirection: + Axis.horizontal, + itemCount: + abilities.length, + itemBuilder: + (context, index) { + if (index < abilities.length) { + String abilityName = abilities[index]['name']; + return Padding( + padding: EdgeInsets.only(right: 8.w), + child: text10400whiteblur(abilityName), + ); + } else { + return SizedBox(); + } + }, + ), + ), + ], + ), + ), + // border: 1 + ), + ], + ), + ), + ], + ); + }, + )), sizedBoxHeight(30.h), - text18w700white("Posts"), ]), ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + text18w700white("Subgroups"), + ], + ), + ), + sizedBoxHeight(20.h), + SizedBox( + height: 190.h, + width: double.infinity, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.only(left: 16.w), + itemCount: getEditProfileIndi! + .data!.myJoinedSubgroups!.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(right: 20.w), + child: profilecardtile( + imagePath: getEditProfileIndi! + .data! + .myJoinedSubgroups![index] + .subGroupData! + .subGroupImage ?? + '', + // cardtile[index]["imagePath"], + title: getEditProfileIndi! + .data! + .myJoinedSubgroups![index] + .subGroupData! + .title! + + // cardtile[index]["title"] + ), + ); + }, + ), + ), normalcardtile( profileImg: 'assets/images/png/Ellipse 48.png', title: 'Jocelyn Dokidis', @@ -973,8 +1299,15 @@ class _ProfileTabState extends State { ); } - Widget commonTimelineCard( - {required String imagePath, required String title}) { + Widget commonTimelineCard({ + required String? imagePath, + required String? title, + required String? role, + required String? teamname, + required String? starttoend, + required int? id, + required List>? abilities, + }) { return Row( children: [ Container( @@ -1008,31 +1341,104 @@ class _ProfileTabState extends State { children: [ commonGlassUI( width: double.infinity, - height: 145.h, + height: 155.h, borderRadius: BorderRadius.circular(10.r), customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), + padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 10.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - CircleAvatar( - radius: 10.r, - backgroundImage: AssetImage(imagePath), + Row( + children: [ + imagePath == null || imagePath.isEmpty + ? CircleAvatar( + radius: 10.r, + backgroundImage: AssetImage( + 'assets/images/png/cimg1.png')) + : CircleAvatar( + radius: 10.r, + backgroundImage: NetworkImage(imagePath)), + sizedBoxWidth(8.w), + title == null || title.isEmpty + ? text14700white('Regroup') + : text14700white(title) + ], ), - sizedBoxWidth(8.w), - text14700white(title) + InkWell( + onTap: () { + setState(() { + timelineremoveid = id; + }); + + // Get.toNamed(RouteName.addtimeline, arguments: { + // 'id': id, + // 'edit': true, + // }); + }, + child: SizedBox( + width: 20.w, + height: 20.h, + child: Image.asset( + "assets/images/png/iconamoon_edit-thin.png", + height: 14.h, + width: 14.w, + ), + ), + ) ], ), sizedBoxHeight(10.h), - text12700white("Team captain"), - sizedBoxHeight(8.h), - text12400white("April 2023 - May 2024"), + role == null || role.isEmpty + ? text12700white('regroup') + : text12700white(role), sizedBoxHeight(10.h), - text10400whiteblur( - "Lorem Ipsum is simply dummy text of the printing and typesetting industry.") + teamname == null || teamname.isEmpty + ? text12700white('regroup') + : text12700white(teamname), + sizedBoxHeight(10.h), + starttoend == null || starttoend.isEmpty + ? text12400white('No date') + : text12400white(starttoend), + sizedBoxHeight(10.h), + abilities == null || abilities.isEmpty + ? text10400whiteblur('No data') + : + // ListView.builder( + // shrinkWrap: true, + // scrollDirection: Axis.horizontal, + // padding: EdgeInsets.only(left: 16.w), + // itemCount: abilities.length, + // itemBuilder: (context, index) { + // return + // text10400whiteblur(abilities.toString()); + + // }, + // ), + + Container( + height: 30.h, // Adjust the height as needed + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: abilities.length, + itemBuilder: (context, index) { + if (index < abilities.length) { + String abilityName = + abilities[index]['name']; + return Padding( + padding: EdgeInsets.only(right: 8.w), + child: text10400whiteblur(abilityName), + ); + } else { + return SizedBox(); + } + }, + ), + ), ], ), ), @@ -1409,19 +1815,24 @@ class _ProfileTabState extends State { )); } - Widget profilecardtile({required String imagePath, required String title}) { + Widget profilecardtile({required String? imagePath, required String? title}) { return Column( children: [ Container( - height: 109.h, - width: 100.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.r), - ), - child: Image.asset(imagePath), - ), + height: 109.h, + width: 100.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + ), + child: imagePath == null || imagePath.isEmpty + ? Image.asset('assets/images/png/Rectangle 29ss.png') + : Image.network(imagePath)), sizedBoxHeight(10.h), - SizedBox(width: 100.w, child: text12w700_FCFCFC(title)), + SizedBox( + width: 100.w, + child: title == null || title.isEmpty + ? text12w700_FCFCFC('Reegroup') + : text12w700_FCFCFC(title)), ], ); } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart index f31a781..aee5e5d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart @@ -8,6 +8,8 @@ import 'package:shared_preferences/shared_preferences.dart'; GetEditProfileIndi? getEditProfileIndi; GetEditProfileBus? getEditProfileBus; +bool accountvisibility = true; + class EditProfileApi { EditProfileApi(); @@ -34,6 +36,12 @@ class EditProfileApi { if (response.status == ResponseStatus.SUCCESS) { if (response.data["status"] == "success") { print("Success---->"); + if (getEditProfileIndi!.data!.accountVisibility == 1) { + accountvisibility = true; + } else { + accountvisibility = false; + } + print(accountvisibility.toString()); return ResponseData( response.data['message'], ResponseStatus.SUCCESS, data: response.data); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart index ea23321..f10c855 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart @@ -141,26 +141,6 @@ class _FollowingState extends State { }, itemBuilder: (context, index) { return - // Column( - // children: [ - // Followinglist( - // imagePath: followingobj?.data?[index] - // .following?.profilePhoto ?? - // '', - // title: followingobj! - // .data?[index].following?.fullName ?? - // '', - // subtitle: followingobj! - // .data?[index].following?.userName ?? - // '', - // unfollowontap: (id) => Uploadata(id), - // unfollowindex: followingobj! - // .data![index].following!.id!, - // ), - // if (index != followingobj!.data!.length - 1) - // commonDivider(), - // ], - // ); Column( children: [ Padding( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart new file mode 100644 index 0000000..67cfe5e --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart @@ -0,0 +1,116 @@ +class GetEditTimelineModel { + String? status; + int? statusCode; + String? message; + Data? data; + + GetEditTimelineModel({this.status, this.statusCode, this.message, this.data}); + + GetEditTimelineModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + data = json['data'] != null ? new Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + List? abilities; + TimelineData? timelineData; + + Data({this.abilities, this.timelineData}); + + Data.fromJson(Map json) { + if (json['abilities'] != null) { + abilities = []; + json['abilities'].forEach((v) { + abilities!.add(new Abilities.fromJson(v)); + }); + } + timelineData = json['timeline_data'] != null + ? new TimelineData.fromJson(json['timeline_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + if (this.abilities != null) { + data['abilities'] = this.abilities!.map((v) => v.toJson()).toList(); + } + if (this.timelineData != null) { + data['timeline_data'] = this.timelineData!.toJson(); + } + return data; + } +} + +class Abilities { + int? id; + String? name; + + Abilities({this.id, this.name}); + + Abilities.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + +class TimelineData { + int? id; + String? clubName; + String? roleName; + String? teamName; + String? startDate; + String? endDate; + String? abilitiesXids; + + TimelineData( + {this.id, + this.clubName, + this.roleName, + this.teamName, + this.startDate, + this.endDate, + this.abilitiesXids}); + + TimelineData.fromJson(Map json) { + id = json['id']; + clubName = json['club_name']; + roleName = json['role_name']; + teamName = json['team_name']; + startDate = json['start_date']; + endDate = json['end_date']; + abilitiesXids = json['abilities_xids']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['club_name'] = this.clubName; + data['role_name'] = this.roleName; + data['team_name'] = this.teamName; + data['start_date'] = this.startDate; + data['end_date'] = this.endDate; + data['abilities_xids'] = this.abilitiesXids; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart new file mode 100644 index 0000000..18b3f0f --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart @@ -0,0 +1,51 @@ +class TimelineAbilityListModel { + String? status; + int? statusCode; + String? message; + List? data; + + TimelineAbilityListModel( + {this.status, this.statusCode, this.message, this.data}); + + TimelineAbilityListModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + String? name; + + Data({this.id, this.name}); + + Data.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart index a37e0aa..9e9d517 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart @@ -3,11 +3,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class AccountSettings extends StatefulWidget { const AccountSettings({super.key}); @@ -17,7 +22,46 @@ class AccountSettings extends StatefulWidget { } class _AccountSettingsState extends State { - bool swichvalue = false; + // bool swichvalue = false; + + Future UploadData() async { + print("upload data called"); + SharedPreferences prefs = await SharedPreferences.getInstance(); + + int? accountype ; + if (accountvisibility == false) { + accountype = 0; + } + else if (accountvisibility == true) { + accountype = 1; + } + Map updata = { + "is_account_visibility": accountype, + }; + + final data = await Profilepostmethod().postAccountvisibility(updata); + + if (data.status == ResponseStatus.SUCCESS) { + String? accountype; + +accountype = prefs.getString('accountTypefromLogin'); + +if (accountype == "1") { + EditProfileApi() + .getEditProfileIndividual(); +} +else if (accountype == "2") { + EditProfileApi() + .getEditProfileBusiness(); +} + + + + return utils.showToast(data.message); + } else { + return utils.showToast(data.message); + } + } @override Widget build(BuildContext context) { return Scaffold( @@ -62,12 +106,15 @@ class _AccountSettingsState extends State { Transform.scale( scale: 0.9, child: CupertinoSwitch( - value: swichvalue, + value: accountvisibility, trackColor: Colors.white.withOpacity(0.4), activeColor: Color(0xFF34C759), - onChanged: (bool? value) { + onChanged: (bool value) { setState(() { - swichvalue = value ?? false; + accountvisibility = value; + UploadData(); + + // swichvalue = value ?? false; }); })) ]), diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/DeleteAccount.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/DeleteAccount.dart index 513816c..de96830 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/DeleteAccount.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/DeleteAccount.dart @@ -1,11 +1,20 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:regroup/Common/CommonButton.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class DeleteAccount extends StatefulWidget { const DeleteAccount({super.key}); @@ -15,54 +24,113 @@ class DeleteAccount extends StatefulWidget { } class _DeleteAccountState extends State { + TextEditingController leavingcontroller = TextEditingController(); + + Uploadata() async { + utils.loader(); + Map updata = { + "reason": leavingcontroller.text, + }; + final data = await Profilepostmethod().postDeleteaccount(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("delete done"); + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.remove('access-token'); + await prefs.remove('fullname'); + await prefs.remove('username'); + await prefs.remove('email'); + await prefs.remove('phone'); + await prefs.remove('accountTypefromLogin'); + await prefs.remove('principal_xid'); + await prefs.remove('accountTypeValue'); + + await prefs.clear(); + + Get.offNamed(RouteName.loginScreen); + + return utils.showToast(data.message); + } else { + Get.back(); + print("delete not done"); + return utils.showToast(data.message); + } + } + @override Widget build(BuildContext context) { - return Scaffold( - // key: _scaffoldKey1, - resizeToAvoidBottomInset: false, - backgroundColor: Color(0xFF222935), - extendBody: true, - appBar: CommonAppbar( - titleTxt: "", - ), - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), fit: BoxFit.fill)), + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + // key: _scaffoldKey1, + // resizeToAvoidBottomInset: false, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "", ), - SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column(children: [ - sizedBoxHeight(25.h), - text20400white("Sad to see you go"), - sizedBoxHeight(16.h), - Image.asset( - "assets/images/png/Frame 1.png", - height: 119.h, - width: 119.w, - ), - sizedBoxHeight(20.h), - SizedBox( - width: 311.w, - child: text16400white( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type ", - textAlign: TextAlign.center), - ), - sizedBoxHeight(30.h), - text18w400white("Tell us why you are leaving ?"), - sizedBoxHeight(10.h), - CustomTextFormField2( - maxlines: 3, - ), - sizedBoxHeight(20.h), - CommonBtn(text: "I don’t want to delete"), - sizedBoxHeight(18.h), - text16400white("Yes I am ready to delete my account"), - ]), + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), ), - ) - ])); + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column(children: [ + sizedBoxHeight(25.h), + text20400white("Sad to see you go"), + sizedBoxHeight(16.h), + Image.asset( + "assets/images/png/Frame 1.png", + height: 119.h, + width: 119.w, + ), + sizedBoxHeight(20.h), + SizedBox( + width: 311.w, + child: text16400white( + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type ", + textAlign: TextAlign.center), + ), + sizedBoxHeight(30.h), + text18w400white("Tell us why you are leaving ?"), + sizedBoxHeight(10.h), + CustomTextFormField2( + maxlines: 3, + hintText: "Enter why are you leaving", + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow(RegExp('[a-zA-Z ]')) + ], + textEditingController: leavingcontroller, + ), + sizedBoxHeight(20.h), + CommonBtn(text: "I don’t want to delete"), + sizedBoxHeight(18.h), + GestureDetector( + onTap: () { + if (leavingcontroller.text.isBlank!) { + utils.showToast('Please tell us why are you leaving'); + } else { + Uploadata(); + } + }, + child: text16400white( + "Yes I am ready to delete my account")), + ]), + ), + ) + ])), + ); } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart index c9ce84e..f0fa363 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart @@ -5,9 +5,12 @@ import 'package:get/get.dart'; import 'package:glassmorphism/glassmorphism.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -20,6 +23,36 @@ class Settings extends StatefulWidget { } class _SettingsState extends State { + + Uploadata() async { + utils.loader(); + final data = await Profilepostmethod().postLogoutaccount(); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("delete done"); + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.remove('access-token'); + await prefs.remove('fullname'); + await prefs.remove('username'); + await prefs.remove('email'); + await prefs.remove('phone'); + await prefs.remove('accountTypefromLogin'); + await prefs.remove('principal_xid'); + await prefs.remove('accountTypeValue'); + + await prefs.clear(); + + Get.offNamed(RouteName.loginScreen); + + return utils.showToast(data.message); + } else { + Get.back(); + print("delete not done"); + return utils.showToast(data.message); + } + } + + @override Widget build(BuildContext context) { return Scaffold( @@ -150,10 +183,11 @@ class _SettingsState extends State { children: [ GestureDetector( onTap: () async { - SharedPreferences prefs = - await SharedPreferences.getInstance(); - await prefs.clear(); - Get.offAllNamed(RouteName.loginScreen); + // SharedPreferences prefs = + // await SharedPreferences.getInstance(); + // await prefs.clear(); + // Get.offAllNamed(RouteName.loginScreen); + Uploadata(); }, child: commonGlassContainer( width: 130.w, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/View/BlockedUsers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/View/BlockedUsers.dart index 89623a6..edfb5b6 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/View/BlockedUsers.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/View/BlockedUsers.dart @@ -1,3 +1,6 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -5,11 +8,13 @@ import 'package:get/get.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Settings/Model/FetchBlockUser.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Settings/ViewModel/BlockedUserApi.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; import 'package:shared_preferences/shared_preferences.dart'; class BlockedUsers extends StatefulWidget { @@ -57,13 +62,16 @@ class _BlockedUsersState extends State { "subtitle": "Lorem ipsum dummy text", }, ]; - late Future myfuture; + + // late Future myfuture; double? blockedXid; + StreamController searchcontroller = StreamController(); + unblockDone(int index) async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setInt('blockedprincipalxid', - fetchblockuser!.data![index].blockedIamPrincipalXid!); + fetchblockuserobj!.data![index].blockedIamPrincipalXid!); blockedXid = prefs.getInt('blockedprincipalxid')!.toDouble(); Map updata = { "blocked_iam_principal_xid": blockedXid.toString(), @@ -83,7 +91,7 @@ class _BlockedUsersState extends State { // utils.showToast('Unblock user successfully'); setState(() { - fetchblockuser!.data!.removeAt(index); + fetchblockuserobj!.data!.removeAt(index); }); print('success'); } else { @@ -104,11 +112,19 @@ class _BlockedUsersState extends State { @override void initState() { - myfuture = BlockUserAPI().fetchBlockUser(); + var updata = ""; + // myfuture = BlockUserAPI().fetchBlockUser(); + BlockUserAPI().getBlockedusers(updata, streamController: searchcontroller); // TODO: implement initState super.initState(); } + @override + void dispose() { + searchcontroller.close(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -119,96 +135,301 @@ class _BlockedUsersState extends State { appBar: CommonAppbar( titleTxt: "Blocked users", ), - body: FutureBuilder( - future: myfuture, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator( - color: Colors.blue, + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + sizedBoxHeight(25.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), ), - ); - } + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // Onboard().postGroupsearch({"search": value}, + // streamController: searchcontroller); + // searchGroups(value!); + BlockUserAPI().getBlockedusers(value, + streamController: searchcontroller); + }, + ), + ), + sizedBoxHeight(25.h), - if (snapshot.hasError) { - return Center( - child: Text( - '${snapshot.error} occurred', - style: TextStyle(fontSize: 18.spMin), - ), - ); - } - - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - print("Data fetched-->"); - return Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage( - "assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - sizedBoxHeight(25.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", - height: 23, - width: 23, - ), - ), - ), - hintText: "Search people", - ), - ), - sizedBoxHeight(25.h), - Expanded( - child: ListView.builder( + // Expanded( + // child: ListView.builder( + // shrinkWrap: true, + // itemCount: fetchblockuser!.data!.length, + // itemBuilder: (context, index) { + // return Column( + // children: [ + // blockedUser( + // imagePath: fetchblockuser!.data![index] + // .blockedProfile!.profilePhoto ?? + // '', + // title: fetchblockuser!.data![index] + // .blockedProfile!.fullName ?? + // '', + // subtitle: fetchblockuser!.data![index] + // .blockedProfile!.userName ?? + // '', + // index: index), + // // blockedUser( + // // imagePath: blockedUserData[index] + // // ["imagePath"], + // // title: blockedUserData[index]["title"], + // // subtitle: blockedUserData[index] + // // ["subtitle"]), + // if (index != fetchblockuser!.data!.length - 1) + // commonDivider(), + // ], + // ); + // }, + // ), + // ), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return fetchblockuserobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: ScrollPhysics(), shrinkWrap: true, - itemCount: fetchblockuser!.data!.length, + itemCount: fetchblockuserobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, itemBuilder: (context, index) { return Column( children: [ blockedUser( - imagePath: fetchblockuser!.data![index] + imagePath: fetchblockuserobj!.data![index] .blockedProfile!.profilePhoto ?? '', - title: fetchblockuser!.data![index] + title: fetchblockuserobj!.data![index] .blockedProfile!.fullName ?? '', - subtitle: fetchblockuser!.data![index] + subtitle: fetchblockuserobj!.data![index] .blockedProfile!.userName ?? '', index: index), - // blockedUser( - // imagePath: blockedUserData[index] - // ["imagePath"], - // title: blockedUserData[index]["title"], - // subtitle: blockedUserData[index] - // ["subtitle"]), - if (index != fetchblockuser!.data!.length - 1) - commonDivider(), ], ); + + // Column( + // children: [ + // Padding( + // padding: EdgeInsets.symmetric( + // vertical: 16.h, horizontal: 16.w), + // child: Row( + // children: [ + // followingobj!.data![index].following! + // .profilePhoto == + // null || + // followingobj! + // .data![index] + // .following! + // .profilePhoto! + // .isEmpty + // ? CircleAvatar( + // backgroundImage: AssetImage( + // 'assets/images/png/Ellipse 43.png'), + // radius: 25.r, + // ) + // : CircleAvatar( + // backgroundImage: NetworkImage( + // followingobj! + // .data![index] + // .following! + // .profilePhoto!), + // radius: 25.r, + // ), + // sizedBoxWidth(10.w), + // Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // children: [ + // followingobj! + // .data![index] + // .following! + // .fullName == + // null || + // followingobj! + // .data![index] + // .following! + // .fullName! + // .isEmpty + // ? text16w400_FCFCFC("Regroup") + // : text16w400_FCFCFC( + // followingobj!.data![index] + // .following!.fullName!), + // sizedBoxHeight(4.h), + // followingobj! + // .data![index] + // .following! + // .userName == + // null || + // followingobj! + // .data![index] + // .following! + // .userName! + // .isEmpty + // ? text12w400_FCFCFC_blur( + // "regroup") + // : text12w400_FCFCFC_blur( + // followingobj!.data![index] + // .following!.userName!) + // ], + // ), + // Spacer(), + // PopupMenuButton( + // surfaceTintColor: Color(0xFF222935), + // constraints: + // BoxConstraints.tightFor( + // width: 176.w), + // offset: Offset(0, 20), + // color: Color(0xFF222935), + // tooltip: "", + // itemBuilder: (BuildContext + // context) => + // [ + // PopupMenuItem( + // onTap: () async { + // setState(() { + // unfollowid = + // followingobj! + // .data![ + // index] + // .following! + // .id ?? + // 0; + // // followingobj!.data!.removeAt(index); + // followingobj!.data! + // .removeWhere((item) => + // item.following! + // .id == + // unfollowid); + // Uploadata(); + // }); + // }, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Unfollow user"), + // Spacer(), + // Image.asset( + // "assets/images/png/Black1323e.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric( + // horizontal: 12.w), + // child: Row( + // children: [ + // text14400white( + // "Message user"), + // Spacer(), + // Image.asset( + // "assets/images/png/fluent_chat-20-22.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // ], + // child: Container( + // height: 20, + // width: 20, + // child: Center( + // child: Image.asset( + // "assets/images/png/Group 1000004071.png", + // height: 22.h, + // width: 4.w, + // ), + // ), + // )), + // ], + // ), + // ), + // ], + // ); }, - ), - ), - sizedBoxHeight(20.h) - ]) - ]); - } - return Container(); - })); + ); + } + }, + ), + sizedBoxHeight(20.h) + ]), + ) + ])); + } + + Widget _buildNoDataBody(context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], + ), + ); } dialogwidget({required int index}) { @@ -273,28 +494,39 @@ class _BlockedUsersState extends State { } Widget blockedUser({ - required String imagePath, - required String title, - required String subtitle, + required String? imagePath, + required String? title, + required String? subtitle, required int index, }) { return Padding( padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 16.w), child: Row( children: [ - CircleAvatar( - backgroundImage: NetworkImage(imagePath), + imagePath == null || imagePath.isEmpty + ? CircleAvatar( + backgroundImage: AssetImage("assets/images/png/cimg3.png"), - // AssetImage(imagePath), - radius: 25.r, - ), + // AssetImage(imagePath), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage(imagePath), + + // AssetImage(imagePath), + radius: 25.r, + ), sizedBoxWidth(10.w), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - text16w400_FCFCFC(title), + title == null || title.isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(title), sizedBoxHeight(4.h), - text12w400_FCFCFC_blur(subtitle), + subtitle == null || subtitle.isEmpty + ? text12w400_FCFCFC_blur('regroup') + : text12w400_FCFCFC_blur(subtitle), ], ), Spacer(), diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/ViewModel/BlockedUserApi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/ViewModel/BlockedUserApi.dart index 7d8640d..10b0369 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/ViewModel/BlockedUserApi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/ViewModel/BlockedUserApi.dart @@ -1,32 +1,34 @@ +import 'dart:async'; + import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Settings/Model/FetchBlockUser.dart'; -FetchBlockedUser? fetchblockuser; +FetchBlockedUser? fetchblockuserobj; class BlockUserAPI { BlockUserAPI(); - Future> fetchBlockUser() async { - final response = await NetworkApiServices().getApi( - ApiUrls.getblockuser, - ); - fetchblockuser = FetchBlockedUser.fromJson(response.data); - if (response.status == ResponseStatus.SUCCESS) { - if (response.data["status"] == "success") { - print("Success---->"); - return ResponseData( - response.data['message'], ResponseStatus.SUCCESS, - data: response.data); - } else { - return ResponseData( - response.data['message'], ResponseStatus.FAILED); - } - } + // Future> fetchBlockUser() async { + // final response = await NetworkApiServices().getApi( + // ApiUrls.getblockuser, + // ); + // fetchblockuser = FetchBlockedUser.fromJson(response.data); + // if (response.status == ResponseStatus.SUCCESS) { + // if (response.data["status"] == "success") { + // print("Success---->"); + // return ResponseData( + // response.data['message'], ResponseStatus.SUCCESS, + // data: response.data); + // } else { + // return ResponseData( + // response.data['message'], ResponseStatus.FAILED); + // } + // } - return response; - } + // return response; + // } Future> postBlockApi(var data) async { final response = await NetworkApiServices().postApi( @@ -50,4 +52,19 @@ class BlockUserAPI { return response; } + Future> getBlockedusers(updata, + {required StreamController streamController}) async { + final response = + await NetworkApiServices().getApi( + "${ApiUrls.getblockuser}?search=$updata", + + ); + + if (response.status == ResponseStatus.SUCCESS) { + fetchblockuserobj = FetchBlockedUser.fromJson(response.data); + if (!streamController.isClosed) streamController.sink.add(fetchblockuserobj!); + } + return response; + } + } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart index f9ca64d..5ce669c 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart @@ -1,16 +1,28 @@ +import 'dart:developer'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:regroup/Common/CommonButton.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart' + as timelineabilist; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CommonDropdown.dart'; +import 'package:regroup/Utils/Common/CustomNextButton.dart'; import 'package:regroup/Utils/Common/CustomTextformfield.dart'; -import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; import 'package:intl/intl.dart'; +import 'package:async/src/future_group.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class AddTimeline extends StatefulWidget { const AddTimeline({super.key}); @@ -22,167 +34,1372 @@ class AddTimeline extends StatefulWidget { class _AddTimelineState extends State { TextEditingController dateController = TextEditingController(); TextEditingController dateController2 = TextEditingController(); + TextEditingController clubNameController = TextEditingController(); + TextEditingController rollnameController = TextEditingController(); + TextEditingController teamnameController = TextEditingController(); - final List _dropdownProductItems = [ - 'Individual', - 'Business', - ]; - - String _selectedAccountType = ''; - - void _onItemSelected(String value) { - setState(() { - _selectedAccountType = value; - }); - } + int id = Get.arguments["id"]; + bool edited = Get.arguments["edit"]; RxBool isChecked = false.obs; + + timelineabilist.TimelineAbilityListModel? abilityModel; + List timeline = []; + List _abilitydrop = []; + + Future fetchABilitylist() async { + TimelineAbilityListApi abilityLsitAPI = TimelineAbilityListApi(); + ResponseData response = await abilityLsitAPI.getAbilitylistApi(); + + if (response.status == ResponseStatus.SUCCESS) { + abilityModel = + timelineabilist.TimelineAbilityListModel.fromJson(response.data!); + setState(() { + timeline = abilityModel!.data ?? []; // Store the fetched cities + _abilitydrop = + timeline.map((platform) => platform.name.toString()).toList(); + }); + log(timeline.toString()); + } else { + print('Failed to fetch abilities'); + } + } + + List selectedabilityid = []; + + void getCatIdFromName(List selectedAbilities) { + selectedabilityid.clear(); // Clear existing selections + for (var name in selectedAbilities) { + for (var i = 0; i < timeline.length; i++) { + if (name == timeline[i].name) { + selectedabilityid.add(timeline[i].id!); + break; // Assuming each name is unique, we break after finding a match + } + } + } + } + + // late Future myfuture; + FutureGroup futureGroup = FutureGroup(); + RxBool isloading = true.obs; + + @override + void initState() { + // TODO: implement initState + + if (edited == true) { + // futureGroup.add( + Profilegetmethod().getEditTimeline(id).then((value) { + clubNameController.text = + edittimelineobj!.data!.timelineData!.clubName ?? ""; + rollnameController.text = + edittimelineobj!.data!.timelineData!.roleName ?? ""; + teamnameController.text = + edittimelineobj!.data!.timelineData!.teamName ?? ""; + ""; + dateController.text = + edittimelineobj!.data!.timelineData!.startDate ?? ""; + dateController2.text = + edittimelineobj!.data!.timelineData!.endDate ?? ""; + String abilitiesXids = + edittimelineobj!.data!.timelineData!.abilitiesXids ?? ""; + abilitiesIds = abilitiesXids + .split(',') + .map((e) => int.tryParse(e.trim()) ?? 0) // Trim spaces around IDs + .toList(); + selectedabilityid = abilitiesIds; + + print(selectedabilityid.toList()); + + for (int i = 0; i < _abilitydrop.length; i++) { + _abilityMap.add({ + "id": i + 1, + "name": _abilitydrop[i], + }); + } + // futureGroup.add( + fetchABilitylist().then((value) { + isloading = false.obs; + }); + // ); + }); + // ); + // myfuture = Profilegetmethod().getEditTimeline(id); + } + + // futureGroup.add( + // ); + // futureGroup.close(); + fetchABilitylist().then((value) { + isloading = false.obs; + }); + + // WidgetsBinding.instance.addPostFrameCallback((_) { + // fetchABilitylist(); + // }); + + // setValues(); + super.initState(); + } + + List abilitiesIds = []; + + UploadData() async { + // SharedPreferences prefs = await SharedPreferences.getInstance(); + utils.loader(); + String abilitiesIds = selectedabilityid.join(','); + print(abilitiesIds); + Map updata = { + "club_name": clubNameController.text, + "role_name": rollnameController.text, + "team_name": teamnameController.text, + "start_date": dateController.text, + "end_date": dateController2.text, + "abilities_xids": abilitiesIds, + }; + final data = await Profilepostmethod().postTimeline(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + // String? accountype; + + // accountype = prefs.getString('accountTypefromLogin'); + + // if (accountype == "1") { + // EditProfileApi().getEditProfileIndividual(); + // } + Get.back(); + print("timeline done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("timeline not done"); + return utils.showToast(data.message); + } + } + + EdituploadData() async { + utils.loader(); + String abilitiesIds = selectedabilityid.join(','); + print(abilitiesIds); + Map updata = { + "club_name": clubNameController.text, + "role_name": rollnameController.text, + "team_name": teamnameController.text, + "start_date": dateController.text, + "end_date": dateController2.text, + "abilities_xids": abilitiesIds, + "timeline_id": id, + }; + final data = await Profilepostmethod().postEditTimeline(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("timeline done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("timeline not done"); + return utils.showToast(data.message); + } + } + +// List> _abilityMap = []; + List> _abilityMap = []; + List listData = []; + +// Function to get names from selected IDs + List getSelectedNames(List selectedIds) { + List selectedNames = []; + for (int id in selectedIds) { + for (Map ability in _abilityMap) { + if (ability["id"] == id) { + selectedNames.add(ability["name"]); + break; + } + } + _abilitydrop = + _abilityMap.map((ability) => ability["name"] as String).toList(); + } + return selectedNames; + } + @override Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: false, - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - appBar: CommonAppbar( - titleTxt: "Add timeline", - ), - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + // resizeToAvoidBottomInset: false, + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "Add timeline", ), - SingleChildScrollView( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: - Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - sizedBoxHeight(20.h), - text16400white("Club name"), - sizedBoxHeight(15.h), - CustomTextFormField(), - sizedBoxHeight(25.h), - text16400white("Role in the club"), - sizedBoxHeight(15.h), - CustomTextFormField(), - sizedBoxHeight(25.h), - text16400white("Team name"), - sizedBoxHeight(15.h), - CustomTextFormField(), - sizedBoxHeight(25.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16400white("Start date "), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker(context, dateController), - child: AbsorbPointer( - child: CustomTextFormField( - textEditingController: dateController, - leadingIcon: Container( - height: 20.h, - width: 20.w, - child: Center( - child: Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, + body: + // edited == true + // ? FutureBuilder( + // future: futureGroup.future, + // builder: (ctx, snapshot) { + // if (snapshot.data == null) { + // return Center( + // child: CircularProgressIndicator( + // color: Colors.blue, + // ), + // ); + // } + // if (snapshot.connectionState == ConnectionState.done) { + // if (snapshot.hasError) { + // return Center( + // child: Text( + // '${snapshot.error} occured', + // style: TextStyle(fontSize: 18.spMin), + // ), + // ); + // } else if (snapshot.hasData) { + // clubNameController.text = + // edittimelineobj!.data!.timelineData!.clubName ?? ""; + // rollnameController.text = + // edittimelineobj!.data!.timelineData!.roleName ?? ""; + // teamnameController.text = + // edittimelineobj!.data!.timelineData!.teamName ?? ""; + // ""; + // dateController.text = + // edittimelineobj!.data!.timelineData!.startDate ?? + // ""; + // dateController2.text = + // edittimelineobj!.data!.timelineData!.endDate ?? ""; + + // // String abilitiesXids = edittimelineobj! + // // .data!.timelineData!.abilitiesXids ?? + // // ""; + // // List abilitiesIds = abilitiesXids + // // .split(',') + // // .map((e) => int.tryParse(e) ?? 0) + // // .toList(); + // String abilitiesXids = edittimelineobj! + // .data!.timelineData!.abilitiesXids ?? + // ""; + // abilitiesIds = abilitiesXids + // .split(',') + // .map((e) => + // int.tryParse(e.trim()) ?? + // 0) // Trim spaces around IDs + // .toList(); + // selectedabilityid = abilitiesIds; + + // print(selectedabilityid.toList()); + + // for (int i = 0; i < _abilitydrop.length; i++) { + // _abilityMap.add({ + // "id": i + 1, + // "name": _abilitydrop[i], + // }); + // } + // } + // } + // return Stack(children: [ + // Container( + // decoration: const BoxDecoration( + // image: DecorationImage( + // image: AssetImage( + // "assets/images/png/Ellipse 1496.png"), + // fit: BoxFit.fill)), + // ), + // ListView(physics: ScrollPhysics(), children: [ + // Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.w), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // sizedBoxHeight(20.h), + // text16400white("Club name"), + // sizedBoxHeight(15.h), + // CustomTextFormField( + // textEditingController: clubNameController, + // texttype: TextInputType.text, + // hintText: 'Enter club name', + // validator: (value) { + // if (value!.isEmpty) { + // return 'Enter your full name '; + // } + // return null; + // }, + // inputFormatters: [ + // // LengthLimitingTextInputFormatter(20), + // RemoveEmojiInputFormatter(), + // FilteringTextInputFormatter.allow( + // RegExp('[a-zA-Z ]')) + // ], + // ), + // sizedBoxHeight(25.h), + // text16400white("Role in the club"), + // sizedBoxHeight(15.h), + // CustomTextFormField( + // textEditingController: rollnameController, + // texttype: TextInputType.text, + // hintText: 'Enter club name', + // validator: (value) { + // if (value!.isEmpty) { + // return 'Enter your full name '; + // } + // return null; + // }, + // inputFormatters: [ + // // LengthLimitingTextInputFormatter(20), + // RemoveEmojiInputFormatter(), + // FilteringTextInputFormatter.allow( + // RegExp('[a-zA-Z ]')) + // ], + // ), + // sizedBoxHeight(25.h), + // text16400white("Team name"), + // sizedBoxHeight(15.h), + // CustomTextFormField( + // textEditingController: teamnameController, + // texttype: TextInputType.text, + // hintText: 'Enter club name', + // validator: (value) { + // if (value!.isEmpty) { + // return 'Enter your full name '; + // } + // return null; + // }, + // inputFormatters: [ + // // LengthLimitingTextInputFormatter(20), + // RemoveEmojiInputFormatter(), + // FilteringTextInputFormatter.allow( + // RegExp('[a-zA-ZS0-9 ]')), + // ], + // ), + // sizedBoxHeight(25.h), + // Row( + // mainAxisAlignment: + // MainAxisAlignment.spaceBetween, + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // children: [ + // text16400white("Start date "), + // sizedBoxHeight(10.h), + // GestureDetector( + // onTap: () => datePicker( + // context, dateController), + // child: AbsorbPointer( + // child: CustomTextFormField( + // textEditingController: + // dateController, + // leadingIcon: Container( + // height: 20.h, + // width: 20.w, + // child: Center( + // child: Image.asset( + // "assets/images/png/calender.png", + // height: 20.h, + // width: 20.w, + // ), + // ), + // ), + // ), + // ), + // ) + // ], + // ), + // ), + // sizedBoxWidth(10.h), + // Expanded( + // child: Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // children: [ + // text16400white("End date"), + // sizedBoxHeight(10.h), + // GestureDetector( + // onTap: () => datePicker( + // context, dateController2), + // child: AbsorbPointer( + // child: CustomTextFormField( + // textEditingController: + // dateController2, + // leadingIcon: Container( + // height: 20.h, + // width: 20.w, + // child: Center( + // child: Image.asset( + // "assets/images/png/calender.png", + // height: 20.h, + // width: 20.w, + // ), + // ), + // ), + // ), + // ), + // ), + // sizedBoxHeight(10.h), + // Row( + // children: [ + // Obx(() { + // return commonGlassContainer( + // border: 1, + // borderradius: 2, + // height: 20.h, + // width: 20.w, + // opacity1: 0.24, + // opacity2: 0.24, + // customWidget: Transform.scale( + // scale: 1.2, + // child: Checkbox( + // side: BorderSide( + // color: Color( + // 0xFF434A53)), + // value: isChecked.value, + // activeColor: + // Colors.transparent, + // checkColor: Colors.white, + // onChanged: ((value) { + // // isChecked.value = value!; + // isChecked.value = + // value!; + // if (isChecked.value) { + // // Set end date to today's date + // dateController2 + // .text = DateFormat( + // 'yyyy-MM-dd') + // .format(DateTime + // .now()); + // } else { + // // Clear end date when checkbox is unchecked + // dateController2 + // .clear(); + // } + // }), + // ), + // ), + // ); + // }), + // sizedBoxWidth(8.w), + // text10400white("Present") + // ], + // ), + // ], + // ), + // ) + // ], + // ), + // text16400white("Ability"), + // sizedBoxHeight(15.h), + // // CustomDropDownCheckBoxTimeline( + // // header: 'Select ability', + // // title: '', + // // listData: _abilitydrop, + // // onItemSelected: getCatIdFromName, + // // initiallySelected: abilitiesIds + // // .map((id) => id.toString()) + // // .toList(), + // // ), + // CustomDropDownCheckBoxTimeline( + // header: 'Select ability', + // title: '', + // listData: listData, + // // _abilityMap.map((ability) => ability["name"]).toList(), + // onItemSelected: getCatIdFromName, + // // (selectedNames) { + // // // Convert selected names back to IDs if needed + // // List selectedIds = []; + // // for (String name in selectedNames) { + // // for (Map ability + // // in _abilityMap) { + // // if (ability["name"] == name) { + // // selectedIds.add(ability["id"]); + // // break; + // // } + // // } + // // } + // // // Use selectedIds as needed + // // print(selectedIds); + // // }, + // initiallySelected: getSelectedNames( + // abilitiesIds), // Pass initially selected names + // ), + // sizedBoxHeight(80.h), + // Padding( + // padding: + // EdgeInsets.symmetric(horizontal: 20.w), + // child: CustomButton( + // text: "Add timeline", + // onPressed: () { + // if (clubNameController.text.isBlank! || + // rollnameController.text.isBlank! || + // teamnameController.text.isBlank! || + // dateController.text.isBlank! || + // dateController2.text.isBlank! || + // selectedabilityid.isEmpty) { + // utils.showToast( + // 'Please fill all fields'); + // } else { + // print(selectedabilityid.toString()); + + // EdituploadData(); + // } + // }, + // ), + // ), + // ]), + // ) + // ]) + // ]); + // }, + // ) + // : + Obx(() + // { + => + isloading.value + ? Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + ], + )) + : edited == true + ? Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), ), - ), - ), - ), - ), - ) - ], - ), - ), - sizedBoxWidth(10.h), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16400white("End date"), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker(context, dateController2), - child: AbsorbPointer( - child: CustomTextFormField( - textEditingController: dateController2, - leadingIcon: Container( - height: 20.h, - width: 20.w, - child: Center( - child: Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, + ListView(physics: ScrollPhysics(), children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 16.w), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + text16400white("Club name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + clubNameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Role in the club"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + rollnameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Team name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + teamnameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp( + '[a-zA-ZS0-9 ]')), + ], + ), + sizedBoxHeight(25.h), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + text16400white( + "Start date "), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController, + leadingIcon: + Container( + height: 20.h, + width: 20.w, + child: Center( + child: + Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ) + ], + ), + ), + sizedBoxWidth(10.h), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + text16400white( + "End date"), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController2), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController2, + leadingIcon: + Container( + height: 20.h, + width: 20.w, + child: Center( + child: + Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ), + sizedBoxHeight(10.h), + Row( + children: [ + Obx(() { + return commonGlassContainer( + border: 1, + borderradius: 2, + height: 20.h, + width: 20.w, + opacity1: 0.24, + opacity2: 0.24, + customWidget: + Transform + .scale( + scale: 1.2, + child: Checkbox( + side: BorderSide( + color: Color( + 0xFF434A53)), + value: + isChecked + .value, + activeColor: + Colors + .transparent, + checkColor: + Colors + .white, + onChanged: + ((value) { + // isChecked.value = value!; + isChecked + .value = + value!; + if (isChecked + .value) { + // Set end date to today's date + dateController2 + .text = DateFormat( + 'yyyy-MM-dd') + .format( + DateTime.now()); + } else { + // Clear end date when checkbox is unchecked + dateController2 + .clear(); + } + }), + ), + ), + ); + }), + sizedBoxWidth(8.w), + text10400white( + "Present") + ], + ), + ], + ), + ) + ], + ), + text16400white("Ability"), + sizedBoxHeight(15.h), + // CustomDropDownCheckBoxTimeline( + // header: 'Select ability', + // title: '', + // listData: _abilitydrop, + // onItemSelected: getCatIdFromName, + // initiallySelected: abilitiesIds + // .map((id) => id.toString()) + // .toList(), + // ), + CustomDropDownCheckBoxTimeline( + header: 'Select ability', + title: '', + listData: _abilitydrop, + // _abilityMap.map((ability) => ability["name"]).toList(), + onItemSelected: getCatIdFromName, + // (selectedNames) { + // // Convert selected names back to IDs if needed + // List selectedIds = []; + // for (String name in selectedNames) { + // for (Map ability + // in _abilityMap) { + // if (ability["name"] == name) { + // selectedIds.add(ability["id"]); + // break; + // } + // } + // } + // // Use selectedIds as needed + // print(selectedIds); + // }, + initiallySelected: getSelectedNames( + abilitiesIds), // Pass initially selected names + ), + sizedBoxHeight(80.h), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w), + child: CustomButton( + text: "Add timeline", + onPressed: () { + if (clubNameController.text.isBlank! || + rollnameController + .text.isBlank! || + teamnameController + .text.isBlank! || + dateController + .text.isBlank! || + dateController2 + .text.isBlank! || + selectedabilityid + .isEmpty) { + utils.showToast( + 'Please fill all fields'); + } else { + print(selectedabilityid + .toString()); + + EdituploadData(); + } + }, + ), + ), + ]), + ) + ]) + ]) + : Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), ), - ), - ), - ), - ), - ), - sizedBoxHeight(10.h), - Row( - children: [ - Obx(() { - return commonGlassContainer( - border: 1, - borderradius: 2, - height: 20.h, - width: 20.w, - opacity1: 0.24, - opacity2: 0.24, - customWidget: Transform.scale( - scale: 1.2, - child: Checkbox( - side: BorderSide(color: Color(0xFF434A53)), - value: isChecked.value, - activeColor: Colors.transparent, - checkColor: Colors.white, - onChanged: ((value) { - isChecked.value = value!; - }), - ), - ), - ); - }), - sizedBoxWidth(8.w), - text10400white("Present") - ], - ), - ], - ), - ) - ], - ), - text16400white("Ability"), - sizedBoxHeight(15.h), - CustomDropDownWidgetSignup( - header: 'Select ability', - title: '', - listData: _dropdownProductItems, - onItemSelected: _onItemSelected, - // leadingImage: - // Image.asset( - // 'assets/images/png/user.png', - // ), - ), - sizedBoxHeight(80.h), - Padding( - padding: EdgeInsets.symmetric(horizontal: 20.w), - child: CommonBtn(text: "Add timeline"), - ), - ]), - )) - ])); + ListView(physics: ScrollPhysics(), children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 16.w), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + text16400white("Club name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + clubNameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Role in the club"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + rollnameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Team name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + teamnameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter + .allow(RegExp( + '[a-zA-ZS0-9 ]')), + ], + ), + sizedBoxHeight(25.h), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + text16400white( + "Start date "), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController, + leadingIcon: + Container( + height: 20.h, + width: 20.w, + child: Center( + child: + Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ) + ], + ), + ), + sizedBoxWidth(10.h), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + text16400white( + "End date"), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController2), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController2, + leadingIcon: + Container( + height: 20.h, + width: 20.w, + child: Center( + child: + Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ), + sizedBoxHeight(10.h), + Row( + children: [ + Obx(() { + return commonGlassContainer( + border: 1, + borderradius: 2, + height: 20.h, + width: 20.w, + opacity1: 0.24, + opacity2: 0.24, + customWidget: + Transform + .scale( + scale: 1.2, + child: Checkbox( + side: BorderSide( + color: Color( + 0xFF434A53)), + value: + isChecked + .value, + activeColor: + Colors + .transparent, + checkColor: + Colors + .white, + onChanged: + ((value) { + // isChecked.value = value!; + isChecked + .value = + value!; + if (isChecked + .value) { + // Set end date to today's date + dateController2 + .text = DateFormat( + 'yyyy-MM-dd') + .format( + DateTime.now()); + } else { + // Clear end date when checkbox is unchecked + dateController2 + .clear(); + } + }), + ), + ), + ); + }), + sizedBoxWidth(8.w), + text10400white( + "Present") + ], + ), + ], + ), + ) + ], + ), + text16400white("Ability"), + sizedBoxHeight(15.h), + CustomDropDownChexkBox( + header: 'Select ability', + title: '', + listData: _abilitydrop, + onItemSelected: getCatIdFromName, + initiallySelected: [], // or pass initial values if needed + ), + sizedBoxHeight(80.h), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w), + child: CustomButton( + text: "Add timeline", + onPressed: () { + if (clubNameController.text.isBlank! || + rollnameController + .text.isBlank! || + teamnameController + .text.isBlank! || + dateController + .text.isBlank! || + dateController2 + .text.isBlank! || + selectedabilityid + .isEmpty) { + utils.showToast( + 'Please fill all fields'); + } else { + print(selectedabilityid + .toString()); + + UploadData(); + } + }, + ), + ), + ]), + ) + ]) + ]) + + // } + )), + ); + } +} + +class CustomDropDownCheckBoxTimeline extends StatefulWidget { + const CustomDropDownCheckBoxTimeline({ + Key? key, + required this.header, + required this.title, + required this.listData, + required this.onItemSelected, + this.leadingImage, + this.showOtherOption = false, + required this.initiallySelected, + }) : super(key: key); + + final String header; + final String title; + final List listData; + final Function(List) onItemSelected; + final Widget? leadingImage; + final bool showOtherOption; + final List initiallySelected; + + @override + State createState() => + _CustomDropDownCheckBoxTimelineState(); +} + +class _CustomDropDownCheckBoxTimelineState + extends State { + RxBool onDropTap = false.obs; + RxList selectedValues = [].obs; + final TextEditingController _textController = TextEditingController(); + + @override + void initState() { + super.initState(); + selectedValues + .addAll(widget.initiallySelected); // Initialize selectedValues + } + + List> _buildDropdownMenuItems() { + List> items = + widget.listData.asMap().entries.map((entry) { + int index = entry.key; + String item = entry.value; + return DropdownMenuItem( + value: item, + child: InkWell( + onTap: () { + setState(() { + if (selectedValues.contains(item)) { + selectedValues.remove(item); + } else { + selectedValues.add(item); + } + _textController.clear(); + widget.onItemSelected( + selectedValues.toList()); // Convert RxList to List + }); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Obx(() { + return Checkbox( + value: selectedValues.contains(item), + activeColor: Colors.white, + checkColor: const Color(0xFFD90B2E), + onChanged: (bool? value) { + setState(() { + if (value == true) { + selectedValues.add(item); + } else { + selectedValues.remove(item); + } + _textController.clear(); + widget.onItemSelected(selectedValues.toList()); + }); + }, + ); + }), + const SizedBox(width: 8), + Text( + item, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + if (index != widget.listData.length - 1) + const Divider(thickness: 1, color: Color(0xFF434A53)), + ], + ), + ), + ); + }).toList(); + + if (widget.showOtherOption) { + items.add( + DropdownMenuItem( + value: _textController.text, + child: Column( + children: [ + const Divider(thickness: 1, color: Color(0xFF434A53)), + Row( + children: [ + Obx(() { + return Checkbox( + value: selectedValues.contains(_textController.text), + activeColor: Colors.white, + onChanged: (bool? value) { + setState(() { + if (value == true && + _textController.text.trim().isNotEmpty) { + selectedValues.add(_textController.text); + } else { + selectedValues.remove(_textController.text); + } + widget.onItemSelected(selectedValues.toList()); + }); + }, + ); + }), + const SizedBox(width: 8), + const Text( + "Other: ", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + ), + Expanded( + child: TextField( + controller: _textController, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w500, + ), + decoration: const InputDecoration( + hintText: '', + hintStyle: TextStyle(color: Colors.white70), + border: UnderlineInputBorder(), + ), + ), + ), + TextButton( + onPressed: () { + setState(() { + if (_textController.text.trim().isNotEmpty) { + selectedValues.add(_textController.text); + widget.onItemSelected(selectedValues.toList()); + } + }); + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + SizedBox(height: 10), + ], + ), + ), + ); + } + return items; + } + + @override + Widget build(BuildContext context) { + return Obx( + () => Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + GestureDetector( + onTap: () { + onDropTap.value = !onDropTap.value; + }, + child: Container( + width: double.infinity, + height: 50, + padding: EdgeInsets.only( + right: 22, + left: 12, + ), + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF).withOpacity(0.10), + borderRadius: onDropTap.value + ? const BorderRadius.vertical( + top: Radius.circular(30), + ) + : const BorderRadius.all(Radius.circular(30)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.50), + const Color(0xFFFFFFFF).withOpacity(0.50), + ], + ), + border: Border.all(color: const Color(0xFF434A53)), + ), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + widget.leadingImage == null + ? SizedBox() + : widget.leadingImage!, + const SizedBox(width: 12), + Text( + selectedValues.isEmpty + ? widget.header + : selectedValues.join(', '), + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400), + ), + const Spacer(), + onDropTap.value + ? Image.asset('assets/images/png/arrowup.png') + : Image.asset('assets/images/png/arrowdown.png'), + ], + ), + ), + ), + ), + if (onDropTap.value) + Scrollbar( + child: Container( + width: double.infinity, + decoration: BoxDecoration( + color: const Color(0xFFFFFFFF).withOpacity(0.10), + borderRadius: const BorderRadius.vertical( + bottom: Radius.circular(30), + ), + border: Border.all(color: const Color(0xFF434A53)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + const Color(0xFFffffff).withOpacity(0.50), + const Color(0xFFFFFFFF).withOpacity(0.50), + ], + ), + ), + child: Column( + children: _buildDropdownMenuItems(), + ), + ), + ), + ], + ), + ); } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart new file mode 100644 index 0000000..37223ee --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart @@ -0,0 +1,32 @@ + + + +import 'package:regroup/Common/api_urls.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart'; + +class TimelineAbilityListApi { + TimelineAbilityListApi(); + var data = ""; + Future> getAbilitylistApi() async { + final response = await NetworkApiServices().getApi( + ApiUrls.gettimelineabilitylist, + + ); + + if (response.status == ResponseStatus.SUCCESS) { + Map responseData = + Map.from(response.data); + if (responseData['status'] == "success") { + print("success"); + TimelineAbilityListModel timelineabilitylistobj = + TimelineAbilityListModel.fromJson(responseData); + } else { + // return ResponseData( + // responseData['message'], ResponseStatus.FAILED); + } + } + return response; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart index 254111f..58f48e3 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart @@ -4,19 +4,24 @@ import 'dart:developer'; import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/faqModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followersModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followingModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/privacyPolicyModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/termsconditionsModel.dart'; +// import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart'; FaqModel? faqobj; PrivacypolicyModel? privacyobj; TermsConditionsModel? termsobj; FollowersModel? followersobj; FollowingModel? followingobj; +GetEditTimelineModel? edittimelineobj; + class Profilegetmethod { + // Profilegetmethod(); Future> getFaqs() async { final response = await NetworkApiServices().getApi( ApiUrls.getfaqs, @@ -78,4 +83,14 @@ class Profilegetmethod { } return response; } + + Future> getEditTimeline(int data) async { + final response = await NetworkApiServices().getApi(ApiUrls.getedittimeline + "/?timeline_id=${data}"); + + if (response.status == ResponseStatus.SUCCESS) { + edittimelineobj = GetEditTimelineModel.fromJson(response.data); + log(edittimelineobj!.data.toString()); + } + return response; + } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart index 064b81d..526fe47 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart @@ -1,9 +1,20 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:dio/dio.dart'; import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class Profilepostmethod { Profilepostmethod(); + Dio dio = Dio(); + + String basicAuth = 'Basic ' + + base64.encode( + utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); + Future> postContactus(updata) async { print("updata is $updata"); @@ -81,4 +92,130 @@ class Profilepostmethod { print("response message is ${response.message}"); return response; } + + Future> postTimeline(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.posttimeline, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + + Future> postAccountvisibility(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postaccountvisibility, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + + Future> postDeleteaccount(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postdeleteaccount, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + + + Future> postLogoutaccount() async { + Response response; + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? token = prefs.getString('access-token'); + + try { + response = await dio.post( + ApiUrls.postlogoutaccount, + options: + Options( + headers: {'authorization': basicAuth, 'access-token': token}, + ), + ); + log(response.toString()); + } on Exception catch (e) { + if (e is DioException) { + log(e.response.toString()); + if (e.response == null) { + return ResponseData( + 'Oops something Went Wrong, Please try again!', + ResponseStatus.FAILED, + ); + } + if (e.response!.statusCode == 401) { + prefs.remove('token'); + prefs.remove('refreshToken'); + // Get.toNamed(RouteName.login); + return ResponseData( + 'Oops something Went Wrong, Please try again!', + ResponseStatus.FAILED, + ); + } + if (e.response!.statusCode == 403) { + if (e.response!.data['message'] is List) { + return ResponseData( + e.response!.data['message'][0]!, ResponseStatus.FAILED, + data: e.response!.data); + } else { + return ResponseData( + e.response!.data['message'], ResponseStatus.FAILED, + data: e.response!.data); + } + } + } + return ResponseData( + 'Oops something Went Wrong', + ResponseStatus.FAILED, + ); + } + + if (response.statusCode == 200 || response.statusCode == 201) { + return ResponseData("success", ResponseStatus.SUCCESS, + data: response.data); + } else if (response.statusCode == 203) { + print(response.data); + return ResponseData("success", ResponseStatus.PRIVATE, + data: response.data); + } else { + try { + return ResponseData( + response.data['message'].toString(), ResponseStatus.FAILED); + } catch (_) { + return ResponseData( + response.statusMessage!, ResponseStatus.FAILED); + } + } + + } + + Future> postEditTimeline(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.posttimeline, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + + Future> postRemoveTimeline(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postremovetimeline, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + } diff --git a/lib/Login/View/loginscreen.dart b/lib/Login/View/loginscreen.dart index 72314d1..31555dd 100644 --- a/lib/Login/View/loginscreen.dart +++ b/lib/Login/View/loginscreen.dart @@ -196,311 +196,387 @@ class _LoginScreenState extends State { } } + Future _onBackButtonPressed( + BuildContext context, + TextEditingController emailController, + TextEditingController passwordController) async { + bool? exitApp = await showDialog( + barrierDismissible: false, + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Color(0xff222935), + title: Text( + 'Exit App', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w500), + ), + content: Text( + 'Do you really want to close the app?', + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontWeight: FontWeight.w500), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(false); + }, + child: const Text( + 'No', + style: TextStyle( + color: Colors.white, + ), + ), + ), + TextButton( + onPressed: () { + emailController.clear(); + passwordController.clear(); + + // Reset form state to remove error borders + + SystemNavigator.pop(); + Navigator.pop(context); + }, + child: const Text( + 'Yes', + style: TextStyle( + color: Color(0xFFD90B2E), + ), + ), + ) + ], + ); + }); + return exitApp ?? false; + } + @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () => FocusManager.instance.primaryFocus?.unfocus(), - child: Scaffold( - resizeToAvoidBottomInset: - false, // Prevent resizing when the keyboard opens - backgroundColor: const Color.fromARGB(255, 18, 32, 47), - body: Stack( - clipBehavior: Clip.none, - children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Choice screen.png"), - fit: BoxFit.cover)), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 150.h, - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Align( - alignment: Alignment.center, - child: Container( - width: 107.w, - height: 70.h, - child: SvgPicture.asset( - "assets/images/svg/onboarding2.svg", - fit: BoxFit.cover, + return WillPopScope( + onWillPop: () async { + _onBackButtonPressed(context, _emailController, _passwordController); + + return true; + }, + child: GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + resizeToAvoidBottomInset: + false, // Prevent resizing when the keyboard opens + backgroundColor: const Color.fromARGB(255, 18, 32, 47), + body: Stack( + clipBehavior: Clip.none, + children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: + AssetImage("assets/images/png/Choice screen.png"), + fit: BoxFit.cover)), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 150.h, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: Align( + alignment: Alignment.center, + child: Container( + width: 107.w, + height: 70.h, + child: SvgPicture.asset( + "assets/images/svg/onboarding2.svg", + fit: BoxFit.cover, + ), ), ), ), - ), - sizedBoxHeight(20.h), - Align( - alignment: Alignment.center, - child: text22400FCFCFC("Find your community")), - sizedBoxHeight(40.h), - Expanded( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text16400white('Email address'), - sizedBoxHeight(10.h), - CustomTextFormField( - textEditingController: _emailController, - hintText: "Enter your email address", - leadingIcon: - // const Icon(Icons.mail_outline), - SizedBox( - width: 22.w, - height: 17.h, - child: Image.asset( - 'assets/images/png/mail.png', + sizedBoxHeight(20.h), + Align( + alignment: Alignment.center, + child: text22400FCFCFC("Find your community")), + sizedBoxHeight(40.h), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + text16400white('Email address'), + sizedBoxHeight(10.h), + CustomTextFormField( + textEditingController: _emailController, + hintText: "Enter your email address", + leadingIcon: + // const Icon(Icons.mail_outline), + SizedBox( + width: 22.w, + height: 17.h, + child: Image.asset( + 'assets/images/png/mail.png', + width: 22.w, + height: 17.h, + ), + ), + // validationMessage: errormsg.value, + validator: (value) { + if (value!.isEmpty) { + return 'Enter your e-mail address'; + } + if (!RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(value)) { + return 'Enter a valid e-mail address'; + } + return null; + }, + // onInput: (p0) { + // if (p0!.isEmpty) { + // errormsg.value = 'Enter your e-mail address'; + // } + // if (!RegExp( + // r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + // .hasMatch(p0!)) { + // errormsg.value = 'Enter a valid e-mail address'; + // } + // return null; + // }, + // validatorText: "Email Id", + + inputFormatters: [ + LengthLimitingTextInputFormatter(30), + RemoveEmojiInputFormatter() + ], + ), + sizedBoxHeight(10.h), + text16400white('Password'), + sizedBoxHeight(10.h), + CustomTextFormField( + isInputPassword: true, + textEditingController: _passwordController, + hintText: 'Enter your password', + leadingIcon: Image.asset( + 'assets/images/png/lock.png', width: 22.w, height: 17.h, ), - ), - // validationMessage: errormsg.value, - validator: (value) { - if (value!.isEmpty) { - return 'Enter your e-mail address'; - } - if (!RegExp( - r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') - .hasMatch(value)) { - return 'Enter a valid e-mail address'; - } - return null; - }, - // onInput: (p0) { - // if (p0!.isEmpty) { - // errormsg.value = 'Enter your e-mail address'; - // } - // if (!RegExp( - // r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') - // .hasMatch(p0!)) { - // errormsg.value = 'Enter a valid e-mail address'; - // } - // return null; - // }, - // validatorText: "Email Id", - - inputFormatters: [ - LengthLimitingTextInputFormatter(30), - RemoveEmojiInputFormatter() - ], - ), - sizedBoxHeight(10.h), - text16400white('Password'), - sizedBoxHeight(10.h), - CustomTextFormField( - isInputPassword: true, - textEditingController: _passwordController, - hintText: 'Enter your password', - leadingIcon: Image.asset( - 'assets/images/png/lock.png', - width: 22.w, - height: 17.h, - ), - // validationMessage: errormsgpass.value, - validator: (value) { - if (value!.isEmpty) { - return 'Please enter your password'; - } - if (!RegExp( - r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$') - .hasMatch(value)) { - return 'Enter a valid password'; - } - - return null; - }, - // onInput: (p0) { - // if (p0 == null || p0.isEmpty) { - // errormsgpass.value = - // 'Please enter your password'; - // } - // return null; - // }, - inputFormatters: [ - LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter() - ], - ), - sizedBoxHeight(10.h), - Align( - alignment: Alignment.centerRight, - child: Padding( - padding: EdgeInsets.only(right: 6.w), - child: GestureDetector( - onTap: () { - Get.toNamed(RouteName.forgotpass); - }, - child: text14400white('Forgot password ?')), - )), - sizedBoxHeight(40.h), - CustomButton( - text: "Login", - onPressed: () { - _logincheck(); - }), - sizedBoxHeight(20.h), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.signupscreen); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text14400white('Don’t have account ? '), - sizedBoxWidth(5.w), - text14700white('Sign up') + // validationMessage: errormsgpass.value, + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your password'; + } + if (!RegExp( + r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$') + .hasMatch(value)) { + return 'Enter a valid password'; + } + + return null; + }, + // onInput: (p0) { + // if (p0 == null || p0.isEmpty) { + // errormsgpass.value = + // 'Please enter your password'; + // } + // return null; + // }, + inputFormatters: [ + LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter() ], ), - ), - sizedBoxHeight(30.h), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 160, - decoration: const ShapeDecoration( - shape: RoundedRectangleBorder( - side: BorderSide( - width: 0.50, - strokeAlign: BorderSide.strokeAlignCenter, - color: Color(0xFF434A53), - ), - ), - ), - ), - sizedBoxWidth(6.w), - text14400white('Or'), - sizedBoxWidth(6.w), - Container( - width: 160, - decoration: const ShapeDecoration( - shape: RoundedRectangleBorder( - side: BorderSide( - width: 0.50, - strokeAlign: BorderSide.strokeAlignCenter, - color: Color(0xFF434A53), - ), - ), - ), - ), - ], - ), - sizedBoxHeight(20.h), - Center( - child: SizedBox( - width: 220.w, + sizedBoxHeight(10.h), + Align( + alignment: Alignment.centerRight, + child: Padding( + padding: EdgeInsets.only(right: 6.w), + child: GestureDetector( + onTap: () { + Get.toNamed(RouteName.forgotpass); + }, + child: + text14400white('Forgot password ?')), + )), + sizedBoxHeight(40.h), + CustomButton( + text: "Login", + onPressed: () { + _logincheck(); + }), + sizedBoxHeight(20.h), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.signupscreen); + }, child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (Platform.isIOS) - GestureDetector( - onTap: () { - _loginWithApple(); - }, - child: Container( - width: 55, - height: 55, - decoration: ShapeDecoration( - gradient: LinearGradient( - begin: const Alignment(0.71, -0.70), - end: const Alignment(-0.71, 0.7), - colors: [ - Colors.white.withOpacity( - 0.07999999821186066), - Colors.white.withOpacity( - 0.12999999523162842) - ], - ), - shape: const OvalBorder( - side: BorderSide( - width: 0.50, - color: Color(0xFF434A53)), - ), - image: const DecorationImage( - image: AssetImage( - 'assets/images/png/login2.png'))), - ), - ), - // const Spacer(), - if (Platform.isAndroid) - GestureDetector( - onTap: () { - _loginWithGoogle(); - }, - child: Container( - width: 55, - height: 55, - decoration: ShapeDecoration( - gradient: LinearGradient( - begin: const Alignment(0.71, -0.70), - end: const Alignment(-0.71, 0.7), - colors: [ - Colors.white.withOpacity( - 0.07999999821186066), - Colors.white.withOpacity( - 0.12999999523162842) - ], - ), - shape: const OvalBorder( - side: BorderSide( - width: 0.50, - color: Color(0xFF434A53)), - ), - image: const DecorationImage( - image: AssetImage( - 'assets/images/png/login3.png'))), - ), - ), - // const Spacer(), - GestureDetector( - onTap: () async { - _checkIfisLoggedIn(); - }, - child: Container( - width: 55, - height: 55, - decoration: ShapeDecoration( - gradient: LinearGradient( - begin: const Alignment(0.71, -0.70), - end: const Alignment(-0.71, 0.7), - colors: [ - Colors.white.withOpacity( - 0.07999999821186066), - Colors.white.withOpacity( - 0.12999999523162842) - ], - ), - shape: const OvalBorder( - side: BorderSide( - width: 0.50, - color: Color(0xFF434A53)), - ), - image: const DecorationImage( - image: AssetImage( - 'assets/images/png/login4.png'))), - ), - ), + text14400white('Don’t have account ? '), + sizedBoxWidth(5.w), + text14700white('Sign up') ], ), ), - ), - // sizedBoxHeight(100) - ], + sizedBoxHeight(30.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 160, + decoration: const ShapeDecoration( + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.50, + strokeAlign: + BorderSide.strokeAlignCenter, + color: Color(0xFF434A53), + ), + ), + ), + ), + sizedBoxWidth(6.w), + text14400white('Or'), + sizedBoxWidth(6.w), + Container( + width: 160, + decoration: const ShapeDecoration( + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.50, + strokeAlign: + BorderSide.strokeAlignCenter, + color: Color(0xFF434A53), + ), + ), + ), + ), + ], + ), + sizedBoxHeight(20.h), + Center( + child: SizedBox( + width: 220.w, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + if (Platform.isIOS) + GestureDetector( + onTap: () { + _loginWithApple(); + }, + child: Container( + width: 55, + height: 55, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: const Alignment( + 0.71, -0.70), + end: + const Alignment(-0.71, 0.7), + colors: [ + Colors.white.withOpacity( + 0.07999999821186066), + Colors.white.withOpacity( + 0.12999999523162842) + ], + ), + shape: const OvalBorder( + side: BorderSide( + width: 0.50, + color: Color(0xFF434A53)), + ), + image: const DecorationImage( + image: AssetImage( + 'assets/images/png/login2.png'))), + ), + ), + // const Spacer(), + if (Platform.isAndroid) + GestureDetector( + onTap: () { + _loginWithGoogle(); + }, + child: Container( + width: 55, + height: 55, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: const Alignment( + 0.71, -0.70), + end: + const Alignment(-0.71, 0.7), + colors: [ + Colors.white.withOpacity( + 0.07999999821186066), + Colors.white.withOpacity( + 0.12999999523162842) + ], + ), + shape: const OvalBorder( + side: BorderSide( + width: 0.50, + color: Color(0xFF434A53)), + ), + image: const DecorationImage( + image: AssetImage( + 'assets/images/png/login3.png'))), + ), + ), + // const Spacer(), + GestureDetector( + onTap: () async { + _checkIfisLoggedIn(); + }, + child: Container( + width: 55, + height: 55, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: + const Alignment(0.71, -0.70), + end: const Alignment(-0.71, 0.7), + colors: [ + Colors.white.withOpacity( + 0.07999999821186066), + Colors.white.withOpacity( + 0.12999999523162842) + ], + ), + shape: const OvalBorder( + side: BorderSide( + width: 0.50, + color: Color(0xFF434A53)), + ), + image: const DecorationImage( + image: AssetImage( + 'assets/images/png/login4.png'))), + ), + ), + ], + ), + ), + ), + // sizedBoxHeight(100) + ], + ), ), ), ), - ), - ], - ), - ], + ], + ), + ], + ), ), ), ); diff --git a/lib/Utils/Common/CommonDropdown.dart b/lib/Utils/Common/CommonDropdown.dart index ac68a99..018e2f5 100644 --- a/lib/Utils/Common/CommonDropdown.dart +++ b/lib/Utils/Common/CommonDropdown.dart @@ -759,7 +759,7 @@ class CustomDropDownChexkBox extends StatefulWidget { required this.title, required this.listData, required this.onItemSelected, - required this.leadingImage, + this.leadingImage, this.showOtherOption = false, required this.initiallySelected, // Added this line }) : super(key: key); @@ -965,7 +965,12 @@ class _CustomDropDownChexkBoxState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (widget.leadingImage != null) widget.leadingImage!, + // if (widget.leadingImage != null) widget.leadingImage!, + widget.leadingImage == null + ? + SizedBox() + : + widget.leadingImage!, const SizedBox(width: 12), Text( selectedValues.isEmpty -- 2.34.1 From 157ce0b4a9a917b827cbc5ecbf0a962075257545 Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Mon, 22 Jul 2024 11:33:10 +0530 Subject: [PATCH 03/21] conflicts resolved --- .../ProfileTab/Following/Following.dart | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart index 88aab2b..549f50c 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart @@ -288,23 +288,35 @@ class _FollowingState extends State { ), ), + ] ), - )), + ] + ) + ), ], - ), - ), - ], - ), - ); - }, - ); + ); + } + ); } - }, - ), - ]) - ])) - ], - ), + } + ) + + + ], + + ), + ] + ) + )] + + + ) + ); + } + + + + // Stack( // children: [ @@ -556,8 +568,6 @@ class _FollowingState extends State { // ])) // ], // ), - ); - } Widget _buildNoDataBody(context) { return Center( -- 2.34.1 From abf668e14c9e235b2f9c6861d2e7729043b137fc Mon Sep 17 00:00:00 2001 From: cj201199 Date: Mon, 22 Jul 2024 20:29:15 +0530 Subject: [PATCH 04/21] Guest View api integration done. --- .../EditProfile/View/ProfileTab.dart | 20 +- .../ProfileTab/Followers/Followers.dart | 1267 +++++++++-------- .../ProfileTab/Following/Following.dart | 949 ++++++------ .../Guest User/Model/GetGuestFollowers.dart | 11 +- .../Guest User/Model/GetGuestFollowing.dart | 6 +- .../Model/GuestGetProfileDataIndi.dart | 125 +- .../View/Business/ProfileTabBusGuest.dart | 53 +- .../View/Individual/ProfileTabIndGuest.dart | 231 ++- .../ProfileTab/Model/followersModel.dart | 8 +- .../ProfileTab/Model/followingModel.dart | 11 +- .../ProfileTab/My Network/MyNetwork.dart | 755 +++++----- lib/main.dart | 2 +- 12 files changed, 2002 insertions(+), 1436 deletions(-) diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index 4e6686a..cc0e74a 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -252,7 +252,11 @@ class _ProfileTabState extends State { GestureDetector( onTap: () { Get.toNamed( - RouteName.mynetwork); + RouteName.mynetwork, + // arguments: { + // "From": 'MainIndProfile', + // } + ); }, child: Container( height: 34.h, @@ -516,6 +520,8 @@ class _ProfileTabState extends State { return Container(); }, ) + + //BusProfile : FutureBuilder( future: businessfuture, builder: (ctx, snapshot) { @@ -607,7 +613,11 @@ class _ProfileTabState extends State { GestureDetector( onTap: () { Get.toNamed( - RouteName.followers); + RouteName.followers, + arguments: { + "From": + 'MainBusProfile', + }); }, child: Column( children: [ @@ -647,7 +657,11 @@ class _ProfileTabState extends State { GestureDetector( onTap: () { Get.toNamed( - RouteName.following); + RouteName.following, + arguments: { + "From": + 'MainBusProfile', + }); }, child: Column( children: [ diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart index f6aa298..b28155e 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart @@ -31,16 +31,28 @@ class _FollowersState extends State { StreamController(); var guestUserid = Get.arguments['UpdataGuestIdfollowers'] ?? ''; + var fromBusFollower = Get.arguments['From'] ?? ''; + var guestUserBusid = Get.arguments['UpdataGuestBusIdfollowers'] ?? ''; + var fromMainBusProfile = Get.arguments['From'] ?? ''; + @override void initState() { // TODO: implement initState var updata = ""; - Profilegetmethod().getFollowers(updata, streamController: searchcontroller); + if (fromMainBusProfile == 'MainBusProfile') { + Profilegetmethod() + .getFollowers(updata, streamController: searchcontroller); + } var guestupdata = ""; - GuestProfileApi().getGuestfollowers(guestUserid, guestupdata, - streamController: guestsearchcontroller); + if (fromBusFollower == 'GuestBusFollowers') { + GuestProfileApi().getGuestfollowers(guestUserBusid, guestupdata, + streamController: guestsearchcontroller); + } else { + GuestProfileApi().getGuestfollowers(guestUserid, guestupdata, + streamController: guestsearchcontroller); + } super.initState(); } @@ -92,580 +104,699 @@ class _FollowersState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, - appBar: CommonAppbar( + appBar: const CommonAppbar( titleTxt: "Followers", ), resizeToAvoidBottomInset: false, - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - SingleChildScrollView( - child: Column(children: [ - Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", - height: 23, - width: 23, - ), - ), - ), - texttype: TextInputType.text, - inputFormatters: [ - RemoveEmojiInputFormatter(), - ], - onInput: (value) { - GuestProfileApi().getGuestfollowers(guestUserid, value, - streamController: guestsearchcontroller); - }, - hintText: "Search people", + body: fromMainBusProfile == 'MainBusProfile' + ? Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: + AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), ), - ), - sizedBoxHeight(25.h), - StreamBuilder( - stream: guestsearchcontroller.stream, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - // Display shimmer effect while waiting for data - return Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - // Handle error state - return Center( - child: Text( - '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), - ), - ); - } else { - // Data has been loaded, show actual UI - return getguestfollowersobj!.data!.isEmpty - ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: getguestfollowersobj!.data!.length, - separatorBuilder: - (BuildContext context, int index) { - return commonDivider(); + SingleChildScrollView( + child: Column(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), + ), + texttype: TextInputType.text, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + Profilegetmethod().getFollowers(value, + streamController: searchcontroller); }, - itemBuilder: (context, index) { - return GestureDetector( - onTap: () { - Get.toNamed(RouteName.profiletabindguest, - arguments: { - "FolloweridIndex": getguestfollowersobj! - .data![index].iamPrincipalXid, - }); - }, - child: Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - getguestfollowersobj! - .data![index] - .follower! - .profilePhoto == - null || - getguestfollowersobj! - .data![index] - .follower! - .profilePhoto! - .isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - getguestfollowersobj! - .data![index] - .follower! - .profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - getguestfollowersobj! - .data![index] - .follower! - .fullName == - null || - getguestfollowersobj! - .data![index] - .follower! - .fullName! - .isEmpty == - true - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC( - getguestfollowersobj! - .data![index] - .follower! - .fullName!), - sizedBoxHeight(4.h), - getguestfollowersobj! - .data![index] - .follower! - .userName == - null || - getguestfollowersobj! - .data![index] - .follower! - .userName! - .isEmpty == - true - ? text12w400_FCFCFC_blur( - "regroup") - : text12w400_FCFCFC_blur( - getguestfollowersobj! - .data![index] - .follower! - .userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: - Color(0xFF222935), - constraints: - BoxConstraints.tightFor( - width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: - (BuildContext context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async { - setState(() { - removeid = getguestfollowersobj! - .data![ - index] - .follower! - .id ?? - 0; - getguestfollowersobj! - .data! - .removeWhere((item) => - item.follower! - .id == - removeid); - RemoveUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets - .symmetric( - horizontal: - 12.w), - child: Row( - children: [ - text14400white( - "Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets - .symmetric( - horizontal: - 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async { - setState(() { - blockid = getguestfollowersobj! - .data![ - index] - .follower! - .id ?? - 0; - getguestfollowersobj! - .data! - .removeWhere((item) => - item.follower! - .id == - blockid); - BlockUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets - .symmetric( - horizontal: - 12.w), - child: Row( - children: [ - text14400white( - "Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), - ) - ], + hintText: "Search people", + ), + ), + sizedBoxHeight(25.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: const TextStyle(fontSize: 18), ), ); + } else { + // Data has been loaded, show actual UI + return followersobj!.data!.isEmpty + ? _buildNoDataBody(context) + : + // ListView.builder( + // shrinkWrap: true, + // itemCount: followersobj!.data!.length, + // itemBuilder: (context, index) { + // return Column( + // children: [ + // followerWidget( + // imagePath: followersobj?.data?[index] + // .follower?.profilePhoto ?? + // "", + // // followersData[index]["imagePath"], + // title: followersobj?.data?[index].follower + // ?.fullName ?? + // "", + // // followersData[index]["title"], + // subtitle: followersobj?.data?[index] + // .follower?.userName ?? + // "", + // blockonTap: () { + // BlockUploadata(followersobj! + // .data![index].follower!.id); + // } + // // followersData[index]["subtitle"] + // ), + // if (index != followersobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + // }, + // ); + + ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: followersobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + followersobj!.data![index].follower! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName + .profiletabindguest, + arguments: { + "FolloweridIndex": + followersobj! + .data![index] + .iamPrincipalXid!, + }) + : Get.toNamed( + RouteName + .profiletabbusguest, + arguments: { + "FolloweridIndex": + followersobj! + .data![index] + .iamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, + horizontal: 16.w), + child: Row( + children: [ + followersobj! + .data![ + index] + .follower! + .profilePhoto == + null || + followersobj! + .data![index] + .follower! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: + const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: + NetworkImage( + followersobj! + .data![ + index] + .follower! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + followersobj! + .data![ + index] + .follower! + .fullName == + null || + followersobj! + .data![ + index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC( + "Regroup") + : text16w400_FCFCFC( + followersobj! + .data![ + index] + .follower! + .fullName!), + sizedBoxHeight(4.h), + followersobj! + .data![ + index] + .follower! + .userName == + null || + followersobj! + .data![ + index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followersobj! + .data![ + index] + .follower! + .userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints + .tightFor( + width: + 176.w), + offset: const Offset(0, 20), + color: + const Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext + context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: + () async { + setState( + () { + removeid = + followersobj!.data![index].follower!.id ?? + 0; + followersobj!.data!.removeWhere((item) => + item.follower!.id == + removeid); + RemoveUploadata(); + }); + }, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Remove user"), + const Spacer(), + Image + .asset( + "assets/images/png/fluent_delete-28-regular.png", + height: + 15.h, + width: + 15.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: + () {}, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image + .asset( + "assets/images/png/fluent_chat-20-regular.png", + height: + 20.h, + width: + 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: + () async { + setState( + () { + blockid = + followersobj!.data![index].follower!.id ?? + 0; + followersobj!.data!.removeWhere((item) => + item.follower!.id == + blockid); + BlockUploadata(); + }); + }, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Block user"), + const Spacer(), + Image + .asset( + "assets/images/png/blockchat.png", + height: + 25.h, + width: + 25.w, + ) + ], + ), + ), + ), + ], + child: SizedBox( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ) + ], + ), + ); + }, + ); + } + }, + ), + ]) + ])) + ]) + : Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: + AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Column(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), + ), + texttype: TextInputType.text, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + if (fromBusFollower == 'GuestBusFollowers') { + GuestProfileApi().getGuestfollowers( + guestUserBusid, value, + streamController: guestsearchcontroller); + } + GuestProfileApi().getGuestfollowers( + guestUserid, value, + streamController: guestsearchcontroller); }, - ); - } - }, - ), - ]) - ])) - ])); - - // Stack(children: [ - // Container( - // decoration: const BoxDecoration( - // image: DecorationImage( - // image: AssetImage("assets/images/png/Ellipse 1496.png"), - // fit: BoxFit.fill)), - // ), - // SingleChildScrollView( - // child: Column(children: [ - // Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: EdgeInsets.symmetric(horizontal: 16.w), - // child: CustomTextFormField( - // leadingIcon: SizedBox( - // height: 23, - // width: 23, - // child: Center( - // child: Image.asset( - // "assets/images/png/ion_search-outline.png", - // height: 23, - // width: 23, - // ), - // ), - // ), - // texttype: TextInputType.text, - // inputFormatters: [ - // RemoveEmojiInputFormatter(), - // ], - // onInput: (value) { - // Profilegetmethod().getFollowers(value, - // streamController: searchcontroller); - // }, - // hintText: "Search people", - // ), - // ), - // sizedBoxHeight(25.h), - // StreamBuilder( - // stream: searchcontroller.stream, - // builder: (ctx, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // // Display shimmer effect while waiting for data - // return Center(child: CircularProgressIndicator()); - // } else if (snapshot.hasError) { - // // Handle error state - // return Center( - // child: Text( - // '${snapshot.error} occurred', - // style: TextStyle(fontSize: 18), - // ), - // ); - // } else { - // // Data has been loaded, show actual UI - // return followersobj!.data!.isEmpty - // ? _buildNoDataBody(context) - // : - // // ListView.builder( - // // shrinkWrap: true, - // // itemCount: followersobj!.data!.length, - // // itemBuilder: (context, index) { - // // return Column( - // // children: [ - // // followerWidget( - // // imagePath: followersobj?.data?[index] - // // .follower?.profilePhoto ?? - // // "", - // // // followersData[index]["imagePath"], - // // title: followersobj?.data?[index].follower - // // ?.fullName ?? - // // "", - // // // followersData[index]["title"], - // // subtitle: followersobj?.data?[index] - // // .follower?.userName ?? - // // "", - // // blockonTap: () { - // // BlockUploadata(followersobj! - // // .data![index].follower!.id); - // // } - // // // followersData[index]["subtitle"] - // // ), - // // if (index != followersobj!.data!.length - 1) - // // commonDivider(), - // // ], - // // ); - // // }, - // // ); - - // ListView.separated( - // physics: ScrollPhysics(), - // shrinkWrap: true, - // itemCount: followersobj!.data!.length, - // separatorBuilder: - // (BuildContext context, int index) { - // return commonDivider(); - // }, - // itemBuilder: (context, index) { - // return Column( - // children: [ - // Padding( - // padding: EdgeInsets.symmetric( - // vertical: 16.h, horizontal: 16.w), - // child: Row( - // children: [ - // followersobj!.data![index].follower! - // .profilePhoto == - // null || - // followersobj! - // .data![index] - // .follower! - // .profilePhoto! - // .isEmpty - // ? CircleAvatar( - // backgroundImage: AssetImage( - // 'assets/images/png/Ellipse 43.png'), - // radius: 25.r, - // ) - // : CircleAvatar( - // backgroundImage: NetworkImage( - // followersobj! - // .data![index] - // .follower! - // .profilePhoto!), - // radius: 25.r, - // ), - // sizedBoxWidth(10.w), - // Column( - // crossAxisAlignment: - // CrossAxisAlignment.start, - // children: [ - // followersobj!.data![index].follower! - // .fullName == - // null || - // followersobj! - // .data![index] - // .follower! - // .fullName! - // .isEmpty == - // true - // ? text16w400_FCFCFC("Regroup") - // : text16w400_FCFCFC( - // followersobj!.data![index] - // .follower!.fullName!), - // sizedBoxHeight(4.h), - // followersobj!.data![index].follower! - // .userName == - // null || - // followersobj! - // .data![index] - // .follower! - // .userName! - // .isEmpty == - // true - // ? text12w400_FCFCFC_blur( - // "regroup") - // : text12w400_FCFCFC_blur( - // followersobj!.data![index] - // .follower!.userName!) - // ], - // ), - // Spacer(), - // PopupMenuButton( - // surfaceTintColor: Color(0xFF222935), - // constraints: - // BoxConstraints.tightFor( - // width: 176.w), - // offset: Offset(0, 20), - // color: Color(0xFF222935), - // tooltip: "", - // itemBuilder: (BuildContext - // context) => - // [ - // PopupMenuItem( - // // onTap: () {}, - // onTap: () async { - // setState(() { - // removeid = followersobj! - // .data![index] - // .follower! - // .id ?? - // 0; - // followersobj!.data! - // .removeWhere((item) => - // item.follower! - // .id == - // removeid); - // RemoveUploadata(); - // }); - // }, - // child: Padding( - // padding: - // EdgeInsets.symmetric( - // horizontal: 12.w), - // child: Row( - // children: [ - // text14400white( - // "Remove user"), - // Spacer(), - // Image.asset( - // "assets/images/png/fluent_delete-28-regular.png", - // height: 15.h, - // width: 15.w, - // ) - // ], - // ), - // ), - // ), - // PopupMenuDivider(), - // PopupMenuItem( - // onTap: () {}, - // child: Padding( - // padding: - // EdgeInsets.symmetric( - // horizontal: 12.w), - // child: Row( - // children: [ - // text14400white( - // "Message user"), - // Spacer(), - // Image.asset( - // "assets/images/png/fluent_chat-20-regular.png", - // height: 20.h, - // width: 20.w, - // ) - // ], - // ), - // ), - // ), - // PopupMenuDivider(), - // PopupMenuItem( - // onTap: () async { - // setState(() { - // blockid = followersobj! - // .data![index] - // .follower! - // .id ?? - // 0; - // followersobj!.data! - // .removeWhere((item) => - // item.follower! - // .id == - // blockid); - // BlockUploadata(); - // }); - // }, - // child: Padding( - // padding: - // EdgeInsets.symmetric( - // horizontal: 12.w), - // child: Row( - // children: [ - // text14400white( - // "Block user"), - // Spacer(), - // Image.asset( - // "assets/images/png/blockchat.png", - // height: 25.h, - // width: 25.w, - // ) - // ], - // ), - // ), - // ), - // ], - // child: Container( - // height: 20, - // width: 20, - // child: Center( - // child: Image.asset( - // "assets/images/png/Group 1000004071.png", - // height: 22.h, - // width: 4.w, - // ), - // ), - // )), - // ], - // ), - // ) - // ], - // ); - // }, - // ); - // } - // }, - // ), - // ]) - // ])) - // ])); + hintText: "Search people", + ), + ), + sizedBoxHeight(25.h), + StreamBuilder( + stream: guestsearchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: const TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return getguestfollowersobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: + getguestfollowersobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + getguestfollowersobj! + .data![index] + .follower! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName + .profiletabindguest, + arguments: { + "FolloweridIndex": + getguestfollowersobj! + .data![index] + .iamPrincipalXid, + }) + : Get.toNamed( + RouteName + .profiletabbusguest, + arguments: { + "FolloweridIndex": + getguestfollowersobj! + .data![index] + .iamPrincipalXid, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, + horizontal: 16.w), + child: Row( + children: [ + getguestfollowersobj! + .data![ + index] + .follower! + .profilePhoto == + null || + getguestfollowersobj! + .data![index] + .follower! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: + const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + getguestfollowersobj! + .data![ + index] + .follower! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + getguestfollowersobj! + .data![ + index] + .follower! + .fullName == + null || + getguestfollowersobj! + .data![ + index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC( + "Regroup") + : text16w400_FCFCFC( + getguestfollowersobj! + .data![ + index] + .follower! + .fullName!), + sizedBoxHeight(4.h), + getguestfollowersobj! + .data![ + index] + .follower! + .userName == + null || + getguestfollowersobj! + .data![ + index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + getguestfollowersobj! + .data![ + index] + .follower! + .userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints + .tightFor( + width: + 176.w), + offset: const Offset(0, 20), + color: + const Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext + context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: + () async { + setState( + () { + removeid = + getguestfollowersobj!.data![index].follower!.id ?? + 0; + getguestfollowersobj!.data!.removeWhere((item) => + item.follower!.id == + removeid); + RemoveUploadata(); + }); + }, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Remove user"), + const Spacer(), + Image + .asset( + "assets/images/png/fluent_delete-28-regular.png", + height: + 15.h, + width: + 15.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: + () {}, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image + .asset( + "assets/images/png/fluent_chat-20-regular.png", + height: + 20.h, + width: + 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: + () async { + setState( + () { + blockid = + getguestfollowersobj!.data![index].follower!.id ?? + 0; + getguestfollowersobj!.data!.removeWhere((item) => + item.follower!.id == + blockid); + BlockUploadata(); + }); + }, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Block user"), + const Spacer(), + Image + .asset( + "assets/images/png/blockchat.png", + height: + 25.h, + width: + 25.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ) + ], + ), + ); + }, + ); + } + }, + ), + ]) + ])) + ])); } Widget _buildNoDataBody(context) { diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart index 65e921f..c7d5e87 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart @@ -32,16 +32,30 @@ class _FollowingState extends State { StreamController(); var guestUserid = Get.arguments['UpdataGuestIdfollowing'] ?? ''; + + var fromBusFollowing = Get.arguments['From'] ?? ''; + + var guestBusUserid = Get.arguments['UpdataGuestBusIdfollowing'] ?? ''; + + var fromMainBusProfile = Get.arguments['From'] ?? ''; + @override void initState() { // TODO: implement initState var updata = ""; - Profilegetmethod().getFollowing(updata, streamController: searchcontroller); + if (fromMainBusProfile == 'MainBusProfile') { + Profilegetmethod() + .getFollowing(updata, streamController: searchcontroller); + } var guestupdata = ""; - - GuestProfileApi().getGuestfollowing(guestUserid, guestupdata, - streamController: guestsearchcontroller); + if (fromBusFollowing == 'GuestBusFollowing') { + GuestProfileApi().getGuestfollowing(guestBusUserid, guestupdata, + streamController: guestsearchcontroller); + } else { + GuestProfileApi().getGuestfollowing(guestUserid, guestupdata, + streamController: guestsearchcontroller); + } super.initState(); } @@ -79,181 +93,218 @@ class _FollowingState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, resizeToAvoidBottomInset: false, - appBar: CommonAppbar( + appBar: const CommonAppbar( titleTxt: "Following", ), - body: Stack( - children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - SingleChildScrollView( - child: Column(children: [ - Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", + body: fromMainBusProfile == 'MainBusProfile' + ? Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Column(children: [ + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + leadingIcon: SizedBox( height: 23, width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), ), + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // Onboard().postGroupsearch({"search": value}, + // streamController: searchcontroller); + // searchGroups(value!); + Profilegetmethod().getFollowing(value, + streamController: searchcontroller); + }, ), ), - hintText: "Search people", - texttype: TextInputType.text, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - ], - onInput: (value) { - GuestProfileApi().getGuestfollowing(guestUserid, value, - streamController: guestsearchcontroller); - }, - ), - ), - sizedBoxHeight(25.h), - StreamBuilder( - stream: guestsearchcontroller.stream, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - // Display shimmer effect while waiting for data - return Center(child: CircularProgressIndicator()); - } else if (snapshot.hasError) { - // Handle error state - return Center( - child: Text( - '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), - ), - ); - } else { - // Data has been loaded, show actual UI - return getguestfollowingobj!.data!.isEmpty - ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: getguestfollowingobj!.data!.length, - separatorBuilder: - (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return GestureDetector( - onTap: () { - Get.toNamed(RouteName.profiletabindguest, - arguments: { - "FollowingidIndex": - getguestfollowingobj!.data![index] - .followingIamPrincipalXid!, - }); + sizedBoxHeight(25.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: const TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return followingobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: followingobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); }, - child: Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - getguestfollowingobj! - .data![index] - .following! - .profilePhoto == - null || - getguestfollowingobj! + itemBuilder: (context, index) { + return + // Column( + // children: [ + // Followinglist( + // imagePath: followingobj?.data?[index] + // .following?.profilePhoto ?? + // '', + // title: followingobj! + // .data?[index].following?.fullName ?? + // '', + // subtitle: followingobj! + // .data?[index].following?.userName ?? + // '', + // unfollowontap: (id) => Uploadata(id), + // unfollowindex: followingobj! + // .data![index].following!.id!, + // ), + // if (index != followingobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + GestureDetector( + onTap: () { + followingobj!.data![index].following! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName.profiletabindguest, + arguments: { + "FollowingidIndex": followingobj! .data![index] - .following! - .profilePhoto! - .isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - getguestfollowingobj! - .data![index] - .following! - .profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, + .followingIamPrincipalXid!, + }) + : Get.toNamed( + RouteName.profiletabbusguest, + arguments: { + "FollowingidIndex": followingobj! + .data![index] + .followingIamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( children: [ - getguestfollowingobj! + followingobj! .data![index] .following! - .fullName == + .profilePhoto == null || - getguestfollowingobj! + followingobj! .data![index] .following! - .fullName! + .profilePhoto! .isEmpty - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC( - getguestfollowingobj! - .data![index] - .following! - .fullName!), - sizedBoxHeight(4.h), - getguestfollowingobj! + ? CircleAvatar( + backgroundImage: const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: + NetworkImage( + followingobj! + .data![index] + .following! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followingobj! + .data![index] + .following! + .fullName == + null || + followingobj! .data![index] .following! - .userName == - null || - getguestfollowingobj! - .data![index] - .following! - .userName! - .isEmpty - ? text12w400_FCFCFC_blur( - "regroup") - : text12w400_FCFCFC_blur( - getguestfollowingobj! - .data![index] - .following! - .userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: - Color(0xFF222935), - constraints: - BoxConstraints.tightFor( - width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: - (BuildContext context) => + .fullName! + .isEmpty + ? text16w400_FCFCFC( + "Regroup") + : text16w400_FCFCFC( + followingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + followingobj! + .data![index] + .following! + .userName == + null || + followingobj! + .data![index] + .following! + .userName! + .isEmpty + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followingobj! + .data![index] + .following! + .userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: const Offset(0, 20), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext + context) => [ PopupMenuItem( onTap: () async { setState(() { - unfollowid = getguestfollowingobj! + unfollowid = followingobj! .data![ index] .following! .id ?? 0; // followingobj!.data!.removeAt(index); - getguestfollowingobj! + followingobj! .data! .removeWhere((item) => item.following! @@ -271,7 +322,7 @@ class _FollowingState extends State { children: [ text14400white( "Unfollow user"), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/Black1323e.png", height: 20.h, @@ -281,7 +332,7 @@ class _FollowingState extends State { ), ), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( onTap: () {}, child: Padding( @@ -293,7 +344,7 @@ class _FollowingState extends State { children: [ text14400white( "Message user"), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/fluent_chat-20-22.png", height: 20.h, @@ -304,283 +355,329 @@ class _FollowingState extends State { ), ), ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ), + ], ), - ], + ); + }, + ); + } + }, + ), + ]) + ])) + ]) + : Stack( + children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: + AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Column(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), + ), + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // GuestProfileApi().getGuestfollowing(guestUserid, value, + // streamController: guestsearchcontroller); + if (fromBusFollowing == 'GuestBusFollowing') { + GuestProfileApi().getGuestfollowing( + guestBusUserid, value, + streamController: guestsearchcontroller); + } else { + GuestProfileApi().getGuestfollowing( + guestUserid, value, + streamController: guestsearchcontroller); + } + }, + ), + ), + sizedBoxHeight(25.h), + StreamBuilder( + stream: guestsearchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: const TextStyle(fontSize: 18), ), ); - }, - ); - } - }, - ), - ]) - ])) - ], - ), - - // Stack( - // children: [ - // Container( - // decoration: const BoxDecoration( - // image: DecorationImage( - // image: AssetImage("assets/images/png/Ellipse 1496.png"), - // fit: BoxFit.fill)), - // ), - // SingleChildScrollView( - // child: Column(children: [ - // Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Padding( - // padding: EdgeInsets.symmetric(horizontal: 16.w), - // child: CustomTextFormField( - // leadingIcon: SizedBox( - // height: 23, - // width: 23, - // child: Center( - // child: Image.asset( - // "assets/images/png/ion_search-outline.png", - // height: 23, - // width: 23, - // ), - // ), - // ), - // hintText: "Search people", - // texttype: TextInputType.text, - // inputFormatters: [ - // // LengthLimitingTextInputFormatter(20), - // RemoveEmojiInputFormatter(), - // ], - // onInput: (value) { - // // Onboard().postGroupsearch({"search": value}, - // // streamController: searchcontroller); - // // searchGroups(value!); - // Profilegetmethod().getFollowing(value, - // streamController: searchcontroller); - // }, - // ), - // ), - // sizedBoxHeight(25.h), - // StreamBuilder( - // stream: searchcontroller.stream, - // builder: (ctx, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // // Display shimmer effect while waiting for data - // return Center(child: CircularProgressIndicator()); - // } else if (snapshot.hasError) { - // // Handle error state - // return Center( - // child: Text( - // '${snapshot.error} occurred', - // style: TextStyle(fontSize: 18), - // ), - // ); - // } else { - // // Data has been loaded, show actual UI - // return followingobj!.data!.isEmpty - // ? _buildNoDataBody(context) - // : ListView.separated( - // physics: ScrollPhysics(), - // shrinkWrap: true, - // itemCount: followingobj!.data!.length, - // separatorBuilder: - // (BuildContext context, int index) { - // return commonDivider(); - // }, - // itemBuilder: (context, index) { - // return - // // Column( - // // children: [ - // // Followinglist( - // // imagePath: followingobj?.data?[index] - // // .following?.profilePhoto ?? - // // '', - // // title: followingobj! - // // .data?[index].following?.fullName ?? - // // '', - // // subtitle: followingobj! - // // .data?[index].following?.userName ?? - // // '', - // // unfollowontap: (id) => Uploadata(id), - // // unfollowindex: followingobj! - // // .data![index].following!.id!, - // // ), - // // if (index != followingobj!.data!.length - 1) - // // commonDivider(), - // // ], - // // ); - // Column( - // children: [ - // Padding( - // padding: EdgeInsets.symmetric( - // vertical: 16.h, horizontal: 16.w), - // child: Row( - // children: [ - // followingobj!.data![index].following! - // .profilePhoto == - // null || - // followingobj! - // .data![index] - // .following! - // .profilePhoto! - // .isEmpty - // ? CircleAvatar( - // backgroundImage: AssetImage( - // 'assets/images/png/Ellipse 43.png'), - // radius: 25.r, - // ) - // : CircleAvatar( - // backgroundImage: NetworkImage( - // followingobj! - // .data![index] - // .following! - // .profilePhoto!), - // radius: 25.r, - // ), - // sizedBoxWidth(10.w), - // Column( - // crossAxisAlignment: - // CrossAxisAlignment.start, - // children: [ - // followingobj! - // .data![index] - // .following! - // .fullName == - // null || - // followingobj! - // .data![index] - // .following! - // .fullName! - // .isEmpty - // ? text16w400_FCFCFC("Regroup") - // : text16w400_FCFCFC( - // followingobj!.data![index] - // .following!.fullName!), - // sizedBoxHeight(4.h), - // followingobj! - // .data![index] - // .following! - // .userName == - // null || - // followingobj! - // .data![index] - // .following! - // .userName! - // .isEmpty - // ? text12w400_FCFCFC_blur( - // "regroup") - // : text12w400_FCFCFC_blur( - // followingobj!.data![index] - // .following!.userName!) - // ], - // ), - // Spacer(), - // PopupMenuButton( - // surfaceTintColor: Color(0xFF222935), - // constraints: - // BoxConstraints.tightFor( - // width: 176.w), - // offset: Offset(0, 20), - // color: Color(0xFF222935), - // tooltip: "", - // itemBuilder: (BuildContext - // context) => - // [ - // PopupMenuItem( - // onTap: () async { - // setState(() { - // unfollowid = - // followingobj! - // .data![ - // index] - // .following! - // .id ?? - // 0; - // // followingobj!.data!.removeAt(index); - // followingobj!.data! - // .removeWhere((item) => - // item.following! - // .id == - // unfollowid); - // Uploadata(); - // }); - // }, - // child: Padding( - // padding: - // EdgeInsets.symmetric( - // horizontal: 12.w), - // child: Row( - // children: [ - // text14400white( - // "Unfollow user"), - // Spacer(), - // Image.asset( - // "assets/images/png/Black1323e.png", - // height: 20.h, - // width: 20.w, - // ) - // ], - // ), - // ), - // ), - // PopupMenuDivider(), - // PopupMenuItem( - // onTap: () {}, - // child: Padding( - // padding: - // EdgeInsets.symmetric( - // horizontal: 12.w), - // child: Row( - // children: [ - // text14400white( - // "Message user"), - // Spacer(), - // Image.asset( - // "assets/images/png/fluent_chat-20-22.png", - // height: 20.h, - // width: 20.w, - // ) - // ], - // ), - // ), - // ), - // ], - // child: Container( - // height: 20, - // width: 20, - // child: Center( - // child: Image.asset( - // "assets/images/png/Group 1000004071.png", - // height: 22.h, - // width: 4.w, - // ), - // ), - // )), - // ], - // ), - // ), - // ], - // ); - // }, - // ); - // } - // }, - // ), - // ]) - // ])) - // ], - // ), + } else { + // Data has been loaded, show actual UI + return getguestfollowingobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: + getguestfollowingobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + getguestfollowingobj! + .data![index] + .following! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName + .profiletabindguest, + arguments: { + "FollowingidIndex": + getguestfollowingobj! + .data![index] + .followingIamPrincipalXid!, + }) + : Get.toNamed( + RouteName + .profiletabbusguest, + arguments: { + "FollowingidIndex": + getguestfollowingobj! + .data![index] + .followingIamPrincipalXid!, + }, + ); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, + horizontal: 16.w), + child: Row( + children: [ + getguestfollowingobj! + .data![ + index] + .following! + .profilePhoto == + null || + getguestfollowingobj! + .data![index] + .following! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: + const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + getguestfollowingobj! + .data![ + index] + .following! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + getguestfollowingobj! + .data![ + index] + .following! + .fullName == + null || + getguestfollowingobj! + .data![ + index] + .following! + .fullName! + .isEmpty + ? text16w400_FCFCFC( + "Regroup") + : text16w400_FCFCFC( + getguestfollowingobj! + .data![ + index] + .following! + .fullName!), + sizedBoxHeight(4.h), + getguestfollowingobj! + .data![ + index] + .following! + .userName == + null || + getguestfollowingobj! + .data![ + index] + .following! + .userName! + .isEmpty + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + getguestfollowingobj! + .data![ + index] + .following! + .userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints + .tightFor( + width: + 176.w), + offset: const Offset(0, 20), + color: + const Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext + context) => + [ + PopupMenuItem( + onTap: + () async { + setState( + () { + unfollowid = + getguestfollowingobj!.data![index].following!.id ?? + 0; + // followingobj!.data!.removeAt(index); + getguestfollowingobj!.data!.removeWhere((item) => + item.following!.id == + unfollowid); + Uploadata(); + }); + }, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Unfollow user"), + const Spacer(), + Image + .asset( + "assets/images/png/Black1323e.png", + height: + 20.h, + width: + 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: + () {}, + child: + Padding( + padding: EdgeInsets.symmetric( + horizontal: + 12.w), + child: + Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image + .asset( + "assets/images/png/fluent_chat-20-22.png", + height: + 20.h, + width: + 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ), + ], + ), + ); + }, + ); + } + }, + ), + ]) + ])) + ], + ), ); } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart index eaa866c..84e829d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowers.dart @@ -61,14 +61,21 @@ class Follower { String? userName; String? fullName; String? profilePhoto; + int? principleTypeXid; - Follower({this.id, this.userName, this.fullName, this.profilePhoto}); + Follower( + {this.id, + this.userName, + this.fullName, + this.profilePhoto, + this.principleTypeXid}); Follower.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; profilePhoto = json['profile_photo']; + principleTypeXid = json['principal_type_xid']; } Map toJson() { @@ -77,6 +84,8 @@ class Follower { data['user_name'] = this.userName; data['full_name'] = this.fullName; data['profile_photo'] = this.profilePhoto; + data['principal_type_xid'] = this.principleTypeXid; + return data; } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart index ad8a848..e6eb03c 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GetGuestFollowing.dart @@ -61,14 +61,17 @@ class Following { String? userName; String? fullName; String? profilePhoto; + int? principleTypeXid; - Following({this.id, this.userName, this.fullName, this.profilePhoto}); + + Following({this.id, this.userName, this.fullName, this.profilePhoto, this.principleTypeXid}); Following.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; profilePhoto = json['profile_photo']; + principleTypeXid = json['principal_type_xid']; } Map toJson() { @@ -77,6 +80,7 @@ class Following { data['user_name'] = this.userName; data['full_name'] = this.fullName; data['profile_photo'] = this.profilePhoto; + data['principal_type_xid'] = this.principleTypeXid; return data; } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart index fa2e75c..28227ab 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart @@ -31,6 +31,7 @@ class Data { String? userName; String? fullName; String? gender; + String? profilePhoto; String? dateOfBirth; List? interest; String? about; @@ -42,13 +43,17 @@ class Data { Follows? follows; List? timelines; int? accountVisibility; + List? myJoinedGroups; List? myJoinedSubgroups; + List? certifications; + int? daysBeforeJoined; Data( {this.id, this.userName, this.fullName, this.gender, + this.profilePhoto, this.dateOfBirth, this.interest, this.about, @@ -60,15 +65,19 @@ class Data { this.follows, this.timelines, this.accountVisibility, - this.myJoinedSubgroups}); + this.myJoinedGroups, + this.myJoinedSubgroups, + this.certifications, + this.daysBeforeJoined}); Data.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; gender = json['gender']; + profilePhoto = json['profile_photo']; dateOfBirth = json['date_of_birth']; - if (json['interest'] != null) { + if (json['interest'] != null) { interest = []; json['interest'].forEach((v) { interest!.add(new Interest.fromJson(v)); @@ -89,12 +98,25 @@ class Data { }); } accountVisibility = json['account_visibility']; + if (json['my_joined_groups'] != null) { + myJoinedGroups = []; + json['my_joined_groups'].forEach((v) { + myJoinedGroups!.add(new MyJoinedGroups.fromJson(v)); + }); + } if (json['my_joined_subgroups'] != null) { myJoinedSubgroups = []; json['my_joined_subgroups'].forEach((v) { myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); }); } + if (json['certifications'] != null) { + certifications = []; + json['certifications'].forEach((v) { + certifications!.add(new Certifications.fromJson(v)); + }); + } + daysBeforeJoined = json['days_before_joined']; } Map toJson() { @@ -103,6 +125,7 @@ class Data { data['user_name'] = this.userName; data['full_name'] = this.fullName; data['gender'] = this.gender; + data['profile_photo'] = this.profilePhoto; data['date_of_birth'] = this.dateOfBirth; if (this.interest != null) { data['interest'] = this.interest!.map((v) => v.toJson()).toList(); @@ -120,10 +143,19 @@ class Data { data['timelines'] = this.timelines!.map((v) => v.toJson()).toList(); } data['account_visibility'] = this.accountVisibility; + if (this.myJoinedGroups != null) { + data['my_joined_groups'] = + this.myJoinedGroups!.map((v) => v.toJson()).toList(); + } if (this.myJoinedSubgroups != null) { data['my_joined_subgroups'] = this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); } + if (this.certifications != null) { + data['certifications'] = + this.certifications!.map((v) => v.toJson()).toList(); + } + data['days_before_joined'] = this.daysBeforeJoined; return data; } } @@ -236,6 +268,58 @@ class Abilities { } } +class MyJoinedGroups { + int? id; + int? iamPrincipalXid; + int? manageGroupXid; + GroupData? groupData; + + MyJoinedGroups( + {this.id, this.iamPrincipalXid, this.manageGroupXid, this.groupData}); + + MyJoinedGroups.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + manageGroupXid = json['manage_group_xid']; + groupData = json['group_data'] != null + ? new GroupData.fromJson(json['group_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['iam_principal_xid'] = this.iamPrincipalXid; + data['manage_group_xid'] = this.manageGroupXid; + if (this.groupData != null) { + data['group_data'] = this.groupData!.toJson(); + } + return data; + } +} + +class GroupData { + int? id; + String? title; + String? groupImage; + + GroupData({this.id, this.title, this.groupImage}); + + GroupData.fromJson(Map json) { + id = json['id']; + title = json['title']; + groupImage = json['group_image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['group_image'] = this.groupImage; + return data; + } +} + class MyJoinedSubgroups { int? id; int? iamPrincipalXid; @@ -294,3 +378,40 @@ class SubGroupData { return data; } } + +class Certifications { + int? id; + String? certificationName; + String? certificationImage; + String? certificationReason; + String? certificationDate; + int? iamPrincipalXid; + + Certifications( + {this.id, + this.certificationName, + this.certificationImage, + this.certificationReason, + this.certificationDate, + this.iamPrincipalXid}); + + Certifications.fromJson(Map json) { + id = json['id']; + certificationName = json['certification_name']; + certificationImage = json['certification_image']; + certificationReason = json['certification_reason']; + certificationDate = json['certification_date']; + iamPrincipalXid = json['iam_principal_xid']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['certification_name'] = this.certificationName; + data['certification_image'] = this.certificationImage; + data['certification_reason'] = this.certificationReason; + data['certification_date'] = this.certificationDate; + data['iam_principal_xid'] = this.iamPrincipalXid; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart index ade1a7f..ba8c3f2 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart @@ -24,7 +24,9 @@ class _profiletabBusGestState extends State { @override void initState() { // TODO: implement initState - updata = "64"; + updata = Get.arguments?['FolloweridIndex'] ?? + Get.arguments?['FollowingidIndex'] ?? + "64"; guestBusfuture = GuestProfileApi().getGuestProfileBus(updata); @@ -76,14 +78,31 @@ class _profiletabBusGestState extends State { children: [ Stack( children: [ - Container( - height: 484.h, - width: double.infinity, - child: Image.asset( - "assets/images/png/Rectangle 49 (1).png", - fit: BoxFit.cover, - ), - ), + guestGetProfileBus!.data!.bannerImage != null + ? Container( + width: double.infinity, + height: 484.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: Image( + image: NetworkImage( + guestGetProfileBus! + .data!.bannerImage ?? + ''), + ).image, + fit: BoxFit.cover, + ), + shape: LinearBorder(), + ), + ) + : Container( + height: 484.h, + width: double.infinity, + child: Image.asset( + "assets/images/png/Rectangle 49 (1).png", + fit: BoxFit.cover, + ), + ), Positioned.fill( child: Container( decoration: BoxDecoration( @@ -129,7 +148,13 @@ class _profiletabBusGestState extends State { GestureDetector( onTap: () { Get.toNamed( - RouteName.followers); + RouteName.followers, + arguments: { + 'From': + "GuestBusFollowers", + 'UpdataGuestBusIdfollowers': + updata + }); }, child: Column( children: [ @@ -168,7 +193,13 @@ class _profiletabBusGestState extends State { GestureDetector( onTap: () { Get.toNamed( - RouteName.following); + RouteName.following, + arguments: { + 'From': + "GuestBusFollowing", + 'UpdataGuestBusIdfollowing': + updata, + }); }, child: Column( children: [ diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart index 9630ae5..1fef178 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -81,8 +81,6 @@ class _ProfileTabIndGuestState extends State { late Future guestIndfuture; var updata; - // FollowingidIndex - @override void initState() { // updata = Get.arguments != null @@ -103,14 +101,14 @@ class _ProfileTabIndGuestState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, // accountTypeValue == '1' || body: FutureBuilder( future: guestIndfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( + return const Center( child: CircularProgressIndicator( color: Colors.blue, ), @@ -144,17 +142,33 @@ class _ProfileTabIndGuestState extends State { children: [ Stack( children: [ - Container( - height: 484.h, - width: double.infinity, - child: Image.asset( - "assets/images/png/profileimg.png", - fit: BoxFit.cover, - ), - ), + guestGetProfileInd!.data!.profilePhoto!.isNotEmpty + ? Container( + width: double.infinity, + height: 484.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: Image( + image: NetworkImage( + guestGetProfileInd! + .data!.profilePhoto!), + ).image, + fit: BoxFit.cover, + ), + shape: LinearBorder(), + ), + ) + : Container( + height: 484.h, + width: double.infinity, + child: Image.asset( + "assets/images/png/profileimg.png", + fit: BoxFit.cover, + ), + ), Positioned.fill( child: Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, @@ -227,7 +241,7 @@ class _ProfileTabIndGuestState extends State { color: Colors.white, width: 1.0, ), - boxShadow: [ + boxShadow: const [ BoxShadow( color: Color(0x66000000), offset: Offset(0, 4), @@ -270,7 +284,7 @@ class _ProfileTabIndGuestState extends State { color: Colors.white, width: 1.0, ), - boxShadow: [ + boxShadow: const [ BoxShadow( color: Color(0x66000000), offset: Offset(0, 4), @@ -321,7 +335,7 @@ class _ProfileTabIndGuestState extends State { height: 40.h, width: 170.w, decoration: BoxDecoration( - color: Color(0xFFD90B2E), + color: const Color(0xFFD90B2E), borderRadius: BorderRadius.circular(30.r), ), @@ -470,7 +484,7 @@ class _ProfileTabIndGuestState extends State { Row( children: [ text18w700white("Timeline"), - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed(RouteName.addtimeline); @@ -488,12 +502,32 @@ class _ProfileTabIndGuestState extends State { height: 300.h, child: ListView.builder( shrinkWrap: true, - itemCount: timeline.length, + itemCount: guestGetProfileInd! + .data!.timelines!.length, itemBuilder: (context, index) { + var abilities; + abilities = guestGetProfileInd!.data! + .timelines![index].abilities! + .map((e) => e.name) + .join(', '); return commonTimelineCard( - imagePath: timeline[index] - ["imagePath"], - title: timeline[index]["title"]); + imagePath: timeline[index] + ["imagePath"], + title: guestGetProfileInd! + .data! + .timelines![index] + .teamName ?? + '', + teamName: guestGetProfileInd! + .data! + .timelines![index] + .teamName ?? + '', + abilities: abilities, + startendDate: + "${guestGetProfileInd!.data!.timelines![index].startDate} - ${guestGetProfileInd!.data!.timelines![index].endDate} " ?? + '', + ); }, )), sizedBoxHeight(30.h), @@ -501,7 +535,7 @@ class _ProfileTabIndGuestState extends State { children: [ text16w700white( "Certifications/Qualifications"), - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed(RouteName.certificate); @@ -515,20 +549,31 @@ class _ProfileTabIndGuestState extends State { child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, - itemCount: certificationData.length, + itemCount: guestGetProfileInd! + .data!.certifications!.length ?? + certificationData.length, itemBuilder: (context, index) { + var certifiData = guestGetProfileInd! + .data!.certifications![index]; return Padding( padding: EdgeInsets.only(right: 20.w), child: certificationCardTile( - imagePath: + imagePath: certifiData + .certificationImage ?? certificationData[index] ["imagePath"], - title: certificationData[index] - ["title"], - subtitle: certificationData[index] - ["subtitle"], - date: certificationData[index] - ["date"]), + title: certifiData + .certificationName ?? + certificationData[index] + ["title"], + subtitle: certifiData + .certificationReason ?? + certificationData[index] + ["subtitle"], + date: + ("Issued ${certifiData.certificationDate}") ?? + (certificationData[index] + ["date"])), ); }, ), @@ -544,13 +589,18 @@ class _ProfileTabIndGuestState extends State { shrinkWrap: true, scrollDirection: Axis.horizontal, padding: EdgeInsets.only(left: 16.w), - itemCount: cardtile.length, + itemCount: guestGetProfileInd! + .data!.myJoinedSubgroups!.length, itemBuilder: (context, index) { + var subGroupData = guestGetProfileInd!.data! + .myJoinedSubgroups![index].subGroupData!; return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( - imagePath: cardtile[index]["imagePath"], - title: cardtile[index]["title"]), + imagePath: subGroupData.subGroupImage ?? + cardtile[index]["imagePath"], + title: subGroupData.title ?? + cardtile[index]["title"]), ); }, ), @@ -585,7 +635,7 @@ class _ProfileTabIndGuestState extends State { sizedBoxHeight(20.h), Row( children: [ - Spacer(), + const Spacer(), commonContainer( width: 40.w, height: 40.h, @@ -706,7 +756,11 @@ class _ProfileTabIndGuestState extends State { } Widget commonTimelineCard( - {required String imagePath, required String title}) { + {required String imagePath, + required String title, + required String teamName, + required String startendDate, + required String abilities}) { return Row( children: [ Container( @@ -720,7 +774,7 @@ class _ProfileTabIndGuestState extends State { child: Container( height: 11.h, width: 11.w, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors.white, shape: BoxShape.circle)), ), Positioned( @@ -728,7 +782,7 @@ class _ProfileTabIndGuestState extends State { child: Container( width: 1.w, height: 170.h, - decoration: BoxDecoration(color: Colors.white), + decoration: const BoxDecoration(color: Colors.white), ), ), ], @@ -759,12 +813,11 @@ class _ProfileTabIndGuestState extends State { ], ), sizedBoxHeight(10.h), - text12700white("Team captain"), + text12700white(teamName), sizedBoxHeight(8.h), - text12400white("April 2023 - May 2024"), + text12400white(startendDate), sizedBoxHeight(10.h), - text10400whiteblur( - "Lorem Ipsum is simply dummy text of the printing and typesetting industry.") + text10400whiteblur(abilities) ], ), ), @@ -824,7 +877,7 @@ class _ProfileTabIndGuestState extends State { sizedBoxWidth(7.w), Icon( Icons.circle, - color: Color(0xFFFCFCFC), + color: const Color(0xFFFCFCFC), size: 4.sp, ), sizedBoxWidth(6.w), @@ -833,12 +886,12 @@ class _ProfileTabIndGuestState extends State { ) ], ), - Spacer(), + const Spacer(), PopupMenuButton( - surfaceTintColor: Color(0xFF222935), + surfaceTintColor: const Color(0xFF222935), constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 50), - color: Color(0xFF222935), + offset: const Offset(0, 50), + color: const Color(0xFF222935), tooltip: "", itemBuilder: (BuildContext context) => [ PopupMenuItem( @@ -856,7 +909,7 @@ class _ProfileTabIndGuestState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/Vector (5).png", height: 15.h, @@ -866,7 +919,7 @@ class _ProfileTabIndGuestState extends State { ), ), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( onTap: () {}, child: Padding( @@ -882,7 +935,7 @@ class _ProfileTabIndGuestState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/share.png", height: 20.h, @@ -892,7 +945,7 @@ class _ProfileTabIndGuestState extends State { ), ), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( onTap: () {}, child: Padding( @@ -908,7 +961,7 @@ class _ProfileTabIndGuestState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/f7_pin-fill (2).png", height: 25.h, @@ -973,7 +1026,7 @@ class _ProfileTabIndGuestState extends State { 'assets/images/png/heart 2.png', 'assets/images/png/party-popper 2.png' ]), - Spacer(), + const Spacer(), commonContainer( width: 30.w, height: 30.h, @@ -1056,11 +1109,12 @@ class _ProfileTabIndGuestState extends State { boxRadius: 30, itemsSpacing: 8, itemScale: 0.4, - itemSize: Size(45, 45), - boxPadding: EdgeInsets.all(8), - boxAnimationDuration: Duration(milliseconds: 200), - itemAnimationDuration: Duration(milliseconds: 500), - hoverDuration: Duration(milliseconds: 700), + itemSize: const Size(45, 45), + boxPadding: const EdgeInsets.all(8), + boxAnimationDuration: const Duration(milliseconds: 200), + itemAnimationDuration: + const Duration(milliseconds: 500), + hoverDuration: const Duration(milliseconds: 700), // toggle: false, child: _buildReactionsIcon(mainImage.value), @@ -1118,14 +1172,28 @@ class _ProfileTabIndGuestState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Container( - height: 40.h, - width: 57.w, - child: Image.asset( - imagePath, - fit: BoxFit.cover, - ), - ), + guestGetProfileInd!.data!.certifications != null + ? Container( + width: 57.w, + height: 40.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: Image( + image: NetworkImage(imagePath), + ).image, + fit: BoxFit.cover, + ), + shape: LinearBorder(), + ), + ) + : Container( + height: 40.h, + width: 57.w, + child: Image.asset( + imagePath, + fit: BoxFit.cover, + ), + ), sizedBoxWidth(10.w), Expanded( child: Column( @@ -1177,7 +1245,7 @@ class _ProfileTabIndGuestState extends State { width: 100.w, height: 30.h, borderRadius: BorderRadius.circular(30.r), - borderColor: Color(0xFFD90B2E), + borderColor: const Color(0xFFD90B2E), borderwidth: 0.9, customWidget: Padding( padding: EdgeInsets.symmetric(horizontal: 10.w), @@ -1188,14 +1256,29 @@ class _ProfileTabIndGuestState extends State { Widget profilecardtile({required String imagePath, required String title}) { return Column( children: [ - Container( - height: 109.h, - width: 100.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.r), - ), - child: Image.asset(imagePath), - ), + guestGetProfileInd!.data!.myJoinedSubgroups!.isNotEmpty + ? Container( + width: 100.w, + height: 109.h, + decoration: ShapeDecoration( + image: DecorationImage( + image: Image( + image: NetworkImage(imagePath), + ).image, + fit: BoxFit.cover, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.r)), + ), + ) + : Container( + height: 109.h, + width: 100.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + ), + child: Image.asset(imagePath), + ), sizedBoxHeight(10.h), SizedBox(width: 100.w, child: text12w700_FCFCFC(title)), ], diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/followersModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/followersModel.dart index 1c0e3d7..c8fcb02 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Model/followersModel.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/followersModel.dart @@ -61,14 +61,18 @@ class Follower { String? userName; String? fullName; String? profilePhoto; + int? principleTypeXid; - Follower({this.id, this.userName, this.fullName, this.profilePhoto}); + + Follower({this.id, this.userName, this.fullName, this.profilePhoto, this.principleTypeXid}); Follower.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; profilePhoto = json['profile_photo']; + principleTypeXid = json['principal_type_xid']; + } Map toJson() { @@ -77,6 +81,8 @@ class Follower { data['user_name'] = this.userName; data['full_name'] = this.fullName; data['profile_photo'] = this.profilePhoto; + data['principal_type_xid'] = this.principleTypeXid; + return data; } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/followingModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/followingModel.dart index 323b892..869a84e 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Model/followingModel.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/followingModel.dart @@ -61,14 +61,21 @@ class Following { String? userName; String? fullName; String? profilePhoto; + int? principleTypeXid; - Following({this.id, this.userName, this.fullName, this.profilePhoto}); + Following( + {this.id, + this.userName, + this.fullName, + this.profilePhoto, + this.principleTypeXid}); Following.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; profilePhoto = json['profile_photo']; + principleTypeXid = json['principal_type_xid']; } Map toJson() { @@ -77,6 +84,8 @@ class Following { data['user_name'] = this.userName; data['full_name'] = this.fullName; data['profile_photo'] = this.profilePhoto; + data['principal_type_xid'] = this.principleTypeXid; + return data; } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart index 0f4d4c7..f85a350 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart @@ -16,6 +16,7 @@ import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; class MyNetwork extends StatefulWidget { @@ -26,14 +27,16 @@ class MyNetwork extends StatefulWidget { } class _MyNetworkState extends State { + // var fromMainIndProfile = Get.arguments['From'] ?? ''; +// MainIndProfile @override Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, resizeToAvoidBottomInset: false, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, - appBar: CommonAppbar( + appBar: const CommonAppbar( titleTxt: "My networks", ), body: Stack(children: [ @@ -58,11 +61,11 @@ class _MyNetworkState extends State { text: 'Following', ), ]), - Expanded( + const Expanded( child: TabBarView( children: [ - followersTab(), - followingTab(), + FollowersTab(), + FollowingTab(), ], ), ), @@ -73,19 +76,20 @@ class _MyNetworkState extends State { } } -class followersTab extends StatefulWidget { - const followersTab({super.key}); +class FollowersTab extends StatefulWidget { + const FollowersTab({super.key}); @override - State createState() => _followersTabState(); + State createState() => _FollowersTabState(); } -class _followersTabState extends State { +class _FollowersTabState extends State { StreamController searchcontroller = StreamController(); @override void initState() { var updata = ""; + Profilegetmethod().getFollowers(updata, streamController: searchcontroller); // TODO: implement initState @@ -204,200 +208,221 @@ class _followersTabState extends State { builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data - return Expanded( + return const Expanded( child: Center(child: CircularProgressIndicator())); } else if (snapshot.hasError) { // Handle error state return Center( child: Text( '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ), ); } else { // Data has been loaded, show actual UI return followersobj!.data!.isEmpty ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followersobj!.data!.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followersobj!.data![index].follower! - .profilePhoto == - null || - followersobj!.data![index].follower! - .profilePhoto!.isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followersobj!.data![index] - .follower!.profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, + : Expanded( + child: ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: followersobj!.data!.length, + separatorBuilder: (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + followersobj!.data![index].follower! + .principleTypeXid == + 1 + ? Get.toNamed(RouteName.profiletabindguest, + arguments: { + "FolloweridIndex": followersobj! + .data![index].iamPrincipalXid!, + }) + : Get.toNamed(RouteName.profiletabbusguest, + arguments: { + "FolloweridIndex": followersobj! + .data![index].iamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( children: [ followersobj!.data![index].follower! - .fullName == + .profilePhoto == null || - followersobj! - .data![index] - .follower! - .fullName! - .isEmpty == - true - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC(followersobj! - .data![index] - .follower! - .fullName!), - sizedBoxHeight(4.h), - followersobj!.data![index].follower! - .userName == - null || - followersobj! - .data![index] - .follower! - .userName! - .isEmpty == - true - ? text12w400_FCFCFC_blur("regroup") - : text12w400_FCFCFC_blur(followersobj! - .data![index].follower!.userName!) + followersobj!.data![index].follower! + .profilePhoto!.isEmpty + ? CircleAvatar( + backgroundImage: const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followersobj!.data![index] + .follower!.profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followersobj!.data![index].follower! + .fullName == + null || + followersobj! + .data![index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(followersobj! + .data![index] + .follower! + .fullName!), + sizedBoxHeight(4.h), + followersobj!.data![index].follower! + .userName == + null || + followersobj! + .data![index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur("regroup") + : text12w400_FCFCFC_blur( + followersobj!.data![index] + .follower!.userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: BoxConstraints.tightFor( + width: 176.w), + offset: const Offset(0, 20), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: () async { + setState(() { + removeid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower!.id == + removeid); + RemoveUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Remove user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_delete-28-regular.png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-regular.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () async { + setState(() { + blockid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower!.id == + blockid); + BlockUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Block user"), + const Spacer(), + Image.asset( + "assets/images/png/blockchat.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: SizedBox( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), ], ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async { - setState(() { - removeid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower!.id == - removeid); - RemoveUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async { - setState(() { - blockid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower!.id == - blockid); - BlockUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), - ) - ], - ); - }, - ); + ) + ], + ), + ); + }, + ), + ); } }, ), @@ -426,14 +451,14 @@ class _followersTabState extends State { } } -class followingTab extends StatefulWidget { - const followingTab({super.key}); +class FollowingTab extends StatefulWidget { + const FollowingTab({super.key}); @override - State createState() => _followingTabState(); + State createState() => _FollowingTabState(); } -class _followingTabState extends State { +class _FollowingTabState extends State { StreamController searchcontroller = StreamController(); List followingData = [ @@ -548,181 +573,217 @@ class _followingTabState extends State { builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data - return Expanded( + return const Expanded( child: Center(child: CircularProgressIndicator())); } else if (snapshot.hasError) { // Handle error state return Center( child: Text( '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), + style: const TextStyle(fontSize: 18), ), ); } else { // Data has been loaded, show actual UI return followingobj!.data!.isEmpty ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followingobj!.data!.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return - // Column( - // children: [ - // Followinglist( - // imagePath: followingobj?.data?[index] - // .following?.profilePhoto ?? - // '', - // title: followingobj! - // .data?[index].following?.fullName ?? - // '', - // subtitle: followingobj! - // .data?[index].following?.userName ?? - // '', - // unfollowontap: (id) => Uploadata(id), - // unfollowindex: followingobj! - // .data![index].following!.id!, - // ), - // if (index != followingobj!.data!.length - 1) - // commonDivider(), - // ], - // ); - Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followingobj!.data![index].following! - .profilePhoto == - null || - followingobj!.data![index].following! - .profilePhoto!.isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followingobj!.data![index] - .following!.profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, + : Expanded( + child: ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: followingobj!.data!.length, + separatorBuilder: (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return + // Column( + // children: [ + // Followinglist( + // imagePath: followingobj?.data?[index] + // .following?.profilePhoto ?? + // '', + // title: followingobj! + // .data?[index].following?.fullName ?? + // '', + // subtitle: followingobj! + // .data?[index].following?.userName ?? + // '', + // unfollowontap: (id) => Uploadata(id), + // unfollowindex: followingobj! + // .data![index].following!.id!, + // ), + // if (index != followingobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + GestureDetector( + onTap: () { + followingobj!.data![index].following! + .principleTypeXid == + 1 + ? Get.toNamed(RouteName.profiletabindguest, + arguments: { + "FollowingidIndex": followingobj! + .data![index] + .followingIamPrincipalXid!, + }) + : Get.toNamed(RouteName.profiletabbusguest, + arguments: { + "FollowingidIndex": followingobj! + .data![index] + .followingIamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( children: [ followingobj!.data![index].following! - .fullName == + .profilePhoto == null || - followingobj!.data![index] - .following!.fullName!.isEmpty - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC(followingobj! - .data![index] - .following! - .fullName!), - sizedBoxHeight(4.h), - followingobj!.data![index].following! - .userName == - null || - followingobj!.data![index] - .following!.userName!.isEmpty - ? text12w400_FCFCFC_blur("regroup") - : text12w400_FCFCFC_blur(followingobj! - .data![index] - .following! - .userName!) + followingobj! + .data![index] + .following! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followingobj! + .data![index] + .following! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followingobj!.data![index].following! + .fullName == + null || + followingobj! + .data![index] + .following! + .fullName! + .isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(followingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + followingobj!.data![index].following! + .userName == + null || + followingobj! + .data![index] + .following! + .userName! + .isEmpty + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followingobj!.data![index] + .following!.userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: BoxConstraints.tightFor( + width: 176.w), + offset: const Offset(0, 20), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () async { + setState(() { + unfollowid = followingobj! + .data![index] + .following! + .id ?? + 0; + // followingobj!.data!.removeAt(index); + followingobj!.data! + .removeWhere((item) => + item.following! + .id == + unfollowid); + Uploadata(); + }); + }, + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Unfollow user"), + const Spacer(), + Image.asset( + "assets/images/png/Black1323e.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-22.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), ], ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () async { - setState(() { - unfollowid = followingobj! - .data![index] - .following! - .id ?? - 0; - // followingobj!.data!.removeAt(index); - followingobj!.data! - .removeWhere((item) => - item.following!.id == - unfollowid); - Uploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Unfollow user"), - Spacer(), - Image.asset( - "assets/images/png/Black1323e.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-22.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), + ), + ], ), - ], - ); - }, + ); + }, + ), ); } }, diff --git a/lib/main.dart b/lib/main.dart index 59cf7bc..d1aa8d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -182,7 +182,7 @@ class _MyAppState extends State with WidgetsBindingObserver { fontFamily: 'Cambria', ), debugShowCheckedModeBanner: false, - initialRoute: RouteName.profiletabbusguest, + initialRoute: RouteName.splashScreen, getPages: AppRoutes.appRoutes(), ), designSize: const Size(390, 844), -- 2.34.1 From 78c6999f943e9f8c69567a2b31f1151bef979381 Mon Sep 17 00:00:00 2001 From: cj201199 Date: Tue, 23 Jul 2024 19:07:41 +0530 Subject: [PATCH 05/21] some changes in guestprofile --- lib/Common/CommonGlassmorphism.dart | 5 +- lib/Common/CommonTabBar.dart | 1 + .../CalenderTab/AddUsers/AddUsers.dart | 6 +- .../Main_Screens/CalenderTab/CalenderTab.dart | 6 +- .../Main_Screens/Community/PostScreen.dart | 6 +- .../EditProfile/View/BusEditProfile.dart | 13 +- .../EditProfile/View/ProfileTab.dart | 50 ++-- .../ProfileTab/Followers/Followers.dart | 169 ++++++------- .../ProfileTab/Following/Following.dart | 157 +++++------- .../View/Business/ProfileTabBusGuest.dart | 50 +++- .../View/Individual/ProfileTabIndGuest.dart | 225 +++++++++++------- lib/Utils/Common/CustomTextformfield.dart | 47 ++-- 12 files changed, 372 insertions(+), 363 deletions(-) diff --git a/lib/Common/CommonGlassmorphism.dart b/lib/Common/CommonGlassmorphism.dart index 0163d9f..0faa4c9 100644 --- a/lib/Common/CommonGlassmorphism.dart +++ b/lib/Common/CommonGlassmorphism.dart @@ -12,7 +12,10 @@ Widget commonGlassContainer({ double opacity2 = 0.05, Color borderColor = const Color(0xff434A53), }) { - return GlassmorphicContainer( + return + + + GlassmorphicContainer( width: width, height: height, borderRadius: borderradius, diff --git a/lib/Common/CommonTabBar.dart b/lib/Common/CommonTabBar.dart index b5b8751..90b1596 100644 --- a/lib/Common/CommonTabBar.dart +++ b/lib/Common/CommonTabBar.dart @@ -10,6 +10,7 @@ class CommonTabBar extends StatelessWidget { @override Widget build(BuildContext context) { return TabBar( + dividerColor: Color(0xFFFFFFFF).withOpacity(0.07), labelStyle: TextStyle( fontSize: 14.sp, diff --git a/lib/Feed Module/Main_Screens/CalenderTab/AddUsers/AddUsers.dart b/lib/Feed Module/Main_Screens/CalenderTab/AddUsers/AddUsers.dart index c857f56..fb9f5e6 100644 --- a/lib/Feed Module/Main_Screens/CalenderTab/AddUsers/AddUsers.dart +++ b/lib/Feed Module/Main_Screens/CalenderTab/AddUsers/AddUsers.dart @@ -59,6 +59,8 @@ class _AddUsersState extends State { List isCheckedList = [false, false, false, false, false, false, false]; + + @override Widget build(BuildContext context) { return Scaffold( @@ -99,10 +101,12 @@ class _AddUsersState extends State { ), sizedBoxHeight(16.h), DefaultTabController( + length: 3, // initialIndex: selectedIndex.value, child: Column(children: [ - CommonTabBar(tabs: const [ + CommonTabBar( + tabs: const [ Tab( text: 'Group', ), diff --git a/lib/Feed Module/Main_Screens/CalenderTab/CalenderTab.dart b/lib/Feed Module/Main_Screens/CalenderTab/CalenderTab.dart index a7bc2b9..ff04ce0 100644 --- a/lib/Feed Module/Main_Screens/CalenderTab/CalenderTab.dart +++ b/lib/Feed Module/Main_Screens/CalenderTab/CalenderTab.dart @@ -179,7 +179,10 @@ class _CalenderTabState extends State { // initialIndex: selectedIndex.value, child: Column( children: [ - CommonTabBar(tabs: const [ + CommonTabBar( + + + tabs: const [ Tab( text: 'My sessions', ), @@ -189,6 +192,7 @@ class _CalenderTabState extends State { ]), Expanded( child: TabBarView( + children: [ MySessionsTab(), ComSessionTab(), diff --git a/lib/Feed Module/Main_Screens/Community/PostScreen.dart b/lib/Feed Module/Main_Screens/Community/PostScreen.dart index 18cbe83..a4f69e2 100644 --- a/lib/Feed Module/Main_Screens/Community/PostScreen.dart +++ b/lib/Feed Module/Main_Screens/Community/PostScreen.dart @@ -92,11 +92,11 @@ class _PostScreenState extends State { borderType: BorderType.RRect, radius: Radius.circular(14.r), color: Color(0xFF434A53), - child: commonGlassContainer( - border: 0, + child: commonGlassUI( width: double.infinity, height: 130.h, - borderradius: 10.r, + borderRadius: BorderRadius.circular(10.r), + borderColor: Colors.transparent, customWidget: bannerPath.isNotEmpty && isbannerAdded ? Stack(children: [ Image.file( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart index c134233..20a07ed 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart @@ -12,6 +12,7 @@ import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewMo import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CommonDropdown.dart'; import 'package:regroup/Utils/Common/ImageUpload.dart'; +import 'package:regroup/Utils/Common/ShimmerCommon.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; @@ -160,11 +161,13 @@ class _BusEditProfileState extends State { future: myfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator( - color: Colors.blue, - ), - ); + return ShimmerCommon(); + + // Center( + // child: CircularProgressIndicator( + // color: Colors.blue, + // ), + // ); } if (snapshot.hasError) { diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index 7644a59..8f3ca26 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -10,7 +10,7 @@ import 'package:regroup/Common/controller/MainScreen.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; -import 'package:regroup/Utils/Common/blureffect.dart'; +import 'package:regroup/Utils/Common/ShimmerCommon.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; @@ -181,11 +181,13 @@ class _ProfileTabState extends State { future: individualfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator( - color: Colors.blue, - ), - ); + return ShimmerCommon(); + + // Center( + // child: CircularProgressIndicator( + // color: Colors.blue, + // ), + // ); } if (snapshot.hasError) { @@ -409,7 +411,6 @@ class _ProfileTabState extends State { ], ), sizedBoxHeight(20.h), - getEditProfileIndi!.data!.timelines!.isEmpty ? Center( child: @@ -575,10 +576,12 @@ class _ProfileTabState extends State { // RemoveTimelineUploadata(); // }); - Get.toNamed(RouteName.addtimeline, arguments: { - 'id': getEditProfileIndi!.data!.timelines![index].id, - 'edit': true, - }); + Get.toNamed( + RouteName.addtimeline, + arguments: { + 'id': getEditProfileIndi!.data!.timelines![index].id, + 'edit': true, + }); }, child: SizedBox( @@ -634,18 +637,16 @@ class _ProfileTabState extends State { .teamName!), sizedBoxHeight( 10.h), - - startToEnd - .isEmpty + startToEnd + .isEmpty ? text12400white( 'No date') : text12400white( startToEnd), sizedBoxHeight( 10.h), - - abilities - .isEmpty + abilities + .isEmpty ? text10400whiteblur( 'No data') : @@ -699,12 +700,10 @@ class _ProfileTabState extends State { }, )), sizedBoxHeight(30.h), - ]), ), Padding( padding: EdgeInsets.symmetric(horizontal: 16.w), - child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -720,15 +719,12 @@ class _ProfileTabState extends State { shrinkWrap: true, scrollDirection: Axis.horizontal, padding: EdgeInsets.only(left: 16.w), - itemCount: getEditProfileIndi! .data!.myJoinedSubgroups!.length, - itemBuilder: (context, index) { return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( - imagePath: getEditProfileIndi! .data! .myJoinedSubgroups![index] @@ -748,7 +744,6 @@ class _ProfileTabState extends State { }, ), ), - normalcardtile( profileImg: 'assets/images/png/Ellipse 48.png', title: 'Jocelyn Dokidis', @@ -811,11 +806,8 @@ class _ProfileTabState extends State { future: businessfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator( - color: Colors.blue, - ), - ); + return ShimmerCommon(); + } if (snapshot.hasError) { @@ -1190,7 +1182,6 @@ class _ProfileTabState extends State { ); } - Widget commonTimelineCard({ required String? imagePath, required String? title, @@ -1200,7 +1191,6 @@ class _ProfileTabState extends State { required int? id, required List>? abilities, }) { - return Row( children: [ Container( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart index b28155e..d2910c5 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Followers/Followers.dart @@ -156,7 +156,8 @@ class _FollowersState extends State { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data - return const Center(child: CircularProgressIndicator()); + return const Center( + child: CircularProgressIndicator()); } else if (snapshot.hasError) { // Handle error state return Center( @@ -210,9 +211,11 @@ class _FollowersState extends State { return commonDivider(); }, itemBuilder: (context, index) { + var mainFollowersData = + followersobj!.data![index]; return GestureDetector( onTap: () { - followersobj!.data![index].follower! + mainFollowersData.follower! .principleTypeXid == 1 ? Get.toNamed( @@ -220,8 +223,7 @@ class _FollowersState extends State { .profiletabindguest, arguments: { "FolloweridIndex": - followersobj! - .data![index] + mainFollowersData .iamPrincipalXid!, }) : Get.toNamed( @@ -229,8 +231,7 @@ class _FollowersState extends State { .profiletabbusguest, arguments: { "FolloweridIndex": - followersobj! - .data![index] + mainFollowersData .iamPrincipalXid!, }); }, @@ -242,14 +243,10 @@ class _FollowersState extends State { horizontal: 16.w), child: Row( children: [ - followersobj! - .data![ - index] - .follower! + mainFollowersData.follower! .profilePhoto == null || - followersobj! - .data![index] + mainFollowersData .follower! .profilePhoto! .isEmpty @@ -260,13 +257,10 @@ class _FollowersState extends State { radius: 25.r, ) : CircleAvatar( - backgroundImage: - NetworkImage( - followersobj! - .data![ - index] - .follower! - .profilePhoto!), + backgroundImage: NetworkImage( + mainFollowersData + .follower! + .profilePhoto!), radius: 25.r, ), sizedBoxWidth(10.w), @@ -275,15 +269,11 @@ class _FollowersState extends State { CrossAxisAlignment .start, children: [ - followersobj! - .data![ - index] + mainFollowersData .follower! .fullName == null || - followersobj! - .data![ - index] + mainFollowersData .follower! .fullName! .isEmpty == @@ -291,21 +281,15 @@ class _FollowersState extends State { ? text16w400_FCFCFC( "Regroup") : text16w400_FCFCFC( - followersobj! - .data![ - index] + mainFollowersData .follower! .fullName!), sizedBoxHeight(4.h), - followersobj! - .data![ - index] + mainFollowersData .follower! .userName == null || - followersobj! - .data![ - index] + mainFollowersData .follower! .userName! .isEmpty == @@ -313,9 +297,7 @@ class _FollowersState extends State { ? text12w400_FCFCFC_blur( "regroup") : text12w400_FCFCFC_blur( - followersobj! - .data![ - index] + mainFollowersData .follower! .userName!) ], @@ -323,15 +305,17 @@ class _FollowersState extends State { const Spacer(), PopupMenuButton( surfaceTintColor: - const Color(0xFF222935), + const Color( + 0xFF222935), constraints: BoxConstraints .tightFor( width: 176.w), - offset: const Offset(0, 20), - color: - const Color(0xFF222935), + offset: + const Offset(0, 20), + color: const Color( + 0xFF222935), tooltip: "", itemBuilder: (BuildContext @@ -517,7 +501,8 @@ class _FollowersState extends State { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data - return const Center(child: CircularProgressIndicator()); + return const Center( + child: CircularProgressIndicator()); } else if (snapshot.hasError) { // Handle error state return Center( @@ -540,11 +525,11 @@ class _FollowersState extends State { return commonDivider(); }, itemBuilder: (context, index) { + var guestFollowerData = + getguestfollowersobj!.data![index]; return GestureDetector( onTap: () { - getguestfollowersobj! - .data![index] - .follower! + guestFollowerData.follower! .principleTypeXid == 1 ? Get.toNamed( @@ -552,8 +537,7 @@ class _FollowersState extends State { .profiletabindguest, arguments: { "FolloweridIndex": - getguestfollowersobj! - .data![index] + guestFollowerData .iamPrincipalXid, }) : Get.toNamed( @@ -561,8 +545,7 @@ class _FollowersState extends State { .profiletabbusguest, arguments: { "FolloweridIndex": - getguestfollowersobj! - .data![index] + guestFollowerData .iamPrincipalXid, }); }, @@ -574,14 +557,10 @@ class _FollowersState extends State { horizontal: 16.w), child: Row( children: [ - getguestfollowersobj! - .data![ - index] - .follower! + guestFollowerData.follower! .profilePhoto == null || - getguestfollowersobj! - .data![index] + guestFollowerData .follower! .profilePhoto! .isEmpty @@ -593,9 +572,7 @@ class _FollowersState extends State { ) : CircleAvatar( backgroundImage: NetworkImage( - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .profilePhoto!), radius: 25.r, @@ -606,15 +583,11 @@ class _FollowersState extends State { CrossAxisAlignment .start, children: [ - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .fullName == null || - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .fullName! .isEmpty == @@ -622,21 +595,15 @@ class _FollowersState extends State { ? text16w400_FCFCFC( "Regroup") : text16w400_FCFCFC( - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .fullName!), sizedBoxHeight(4.h), - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .userName == null || - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .userName! .isEmpty == @@ -644,9 +611,7 @@ class _FollowersState extends State { ? text12w400_FCFCFC_blur( "regroup") : text12w400_FCFCFC_blur( - getguestfollowersobj! - .data![ - index] + guestFollowerData .follower! .userName!) ], @@ -654,15 +619,17 @@ class _FollowersState extends State { const Spacer(), PopupMenuButton( surfaceTintColor: - const Color(0xFF222935), + const Color( + 0xFF222935), constraints: BoxConstraints .tightFor( width: 176.w), - offset: const Offset(0, 20), - color: - const Color(0xFF222935), + offset: + const Offset(0, 20), + color: const Color( + 0xFF222935), tooltip: "", itemBuilder: (BuildContext @@ -672,16 +639,16 @@ class _FollowersState extends State { // onTap: () {}, onTap: () async { - setState( - () { - removeid = - getguestfollowersobj!.data![index].follower!.id ?? - 0; - getguestfollowersobj!.data!.removeWhere((item) => - item.follower!.id == - removeid); - RemoveUploadata(); - }); + // setState( + // () { + // removeid = + // getguestfollowersobj!.data![index].follower!.id ?? + // 0; + // getguestfollowersobj!.data!.removeWhere((item) => + // item.follower!.id == + // removeid); + // RemoveUploadata(); + // }); }, child: Padding( @@ -692,7 +659,7 @@ class _FollowersState extends State { Row( children: [ text14400white( - "Remove user"), + ""), const Spacer(), Image .asset( @@ -737,16 +704,16 @@ class _FollowersState extends State { PopupMenuItem( onTap: () async { - setState( - () { - blockid = - getguestfollowersobj!.data![index].follower!.id ?? - 0; - getguestfollowersobj!.data!.removeWhere((item) => - item.follower!.id == - blockid); - BlockUploadata(); - }); + // setState( + // () { + // blockid = + // getguestfollowersobj!.data![index].follower!.id ?? + // 0; + // getguestfollowersobj!.data!.removeWhere((item) => + // item.follower!.id == + // blockid); + // BlockUploadata(); + // }); }, child: Padding( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart index c7d5e87..31bc182 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Following/Following.dart @@ -167,6 +167,8 @@ class _FollowingState extends State { return commonDivider(); }, itemBuilder: (context, index) { + var mainFollowing = + followingobj!.data![index]; return // Column( // children: [ @@ -190,21 +192,19 @@ class _FollowingState extends State { // ); GestureDetector( onTap: () { - followingobj!.data![index].following! + mainFollowing.following! .principleTypeXid == 1 ? Get.toNamed( RouteName.profiletabindguest, arguments: { - "FollowingidIndex": followingobj! - .data![index] + "FollowingidIndex": mainFollowing .followingIamPrincipalXid!, }) : Get.toNamed( RouteName.profiletabbusguest, arguments: { - "FollowingidIndex": followingobj! - .data![index] + "FollowingidIndex": mainFollowing .followingIamPrincipalXid!, }); }, @@ -215,26 +215,21 @@ class _FollowingState extends State { vertical: 16.h, horizontal: 16.w), child: Row( children: [ - followingobj! - .data![index] - .following! + mainFollowing.following! .profilePhoto == null || - followingobj! - .data![index] - .following! - .profilePhoto! - .isEmpty + mainFollowing.following! + .profilePhoto!.isEmpty ? CircleAvatar( - backgroundImage: const AssetImage( - 'assets/images/png/Ellipse 43.png'), + backgroundImage: + const AssetImage( + 'assets/images/png/Ellipse 43.png'), radius: 25.r, ) : CircleAvatar( backgroundImage: NetworkImage( - followingobj! - .data![index] + mainFollowing .following! .profilePhoto!), radius: 25.r, @@ -244,39 +239,31 @@ class _FollowingState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - followingobj! - .data![index] - .following! + mainFollowing.following! .fullName == null || - followingobj! - .data![index] + mainFollowing .following! .fullName! .isEmpty ? text16w400_FCFCFC( "Regroup") : text16w400_FCFCFC( - followingobj! - .data![index] + mainFollowing .following! .fullName!), sizedBoxHeight(4.h), - followingobj! - .data![index] - .following! + mainFollowing.following! .userName == null || - followingobj! - .data![index] + mainFollowing .following! .userName! .isEmpty ? text12w400_FCFCFC_blur( "regroup") : text12w400_FCFCFC_blur( - followingobj! - .data![index] + mainFollowing .following! .userName!) ], @@ -289,7 +276,8 @@ class _FollowingState extends State { BoxConstraints.tightFor( width: 176.w), offset: const Offset(0, 20), - color: const Color(0xFF222935), + color: + const Color(0xFF222935), tooltip: "", itemBuilder: (BuildContext context) => @@ -297,12 +285,11 @@ class _FollowingState extends State { PopupMenuItem( onTap: () async { setState(() { - unfollowid = followingobj! - .data![ - index] - .following! - .id ?? - 0; + unfollowid = + mainFollowing + .following! + .id ?? + 0; // followingobj!.data!.removeAt(index); followingobj! .data! @@ -436,7 +423,8 @@ class _FollowingState extends State { if (snapshot.connectionState == ConnectionState.waiting) { // Display shimmer effect while waiting for data - return const Center(child: CircularProgressIndicator()); + return const Center( + child: CircularProgressIndicator()); } else if (snapshot.hasError) { // Handle error state return Center( @@ -459,11 +447,11 @@ class _FollowingState extends State { return commonDivider(); }, itemBuilder: (context, index) { + var guestFollowing = + getguestfollowingobj!.data![index]; return GestureDetector( onTap: () { - getguestfollowingobj! - .data![index] - .following! + guestFollowing.following! .principleTypeXid == 1 ? Get.toNamed( @@ -471,8 +459,7 @@ class _FollowingState extends State { .profiletabindguest, arguments: { "FollowingidIndex": - getguestfollowingobj! - .data![index] + guestFollowing .followingIamPrincipalXid!, }) : Get.toNamed( @@ -480,8 +467,7 @@ class _FollowingState extends State { .profiletabbusguest, arguments: { "FollowingidIndex": - getguestfollowingobj! - .data![index] + guestFollowing .followingIamPrincipalXid!, }, ); @@ -494,14 +480,10 @@ class _FollowingState extends State { horizontal: 16.w), child: Row( children: [ - getguestfollowingobj! - .data![ - index] - .following! + guestFollowing.following! .profilePhoto == null || - getguestfollowingobj! - .data![index] + guestFollowing .following! .profilePhoto! .isEmpty @@ -512,12 +494,11 @@ class _FollowingState extends State { radius: 25.r, ) : CircleAvatar( - backgroundImage: NetworkImage( - getguestfollowingobj! - .data![ - index] - .following! - .profilePhoto!), + backgroundImage: + NetworkImage( + guestFollowing + .following! + .profilePhoto!), radius: 25.r, ), sizedBoxWidth(10.w), @@ -526,45 +507,31 @@ class _FollowingState extends State { CrossAxisAlignment .start, children: [ - getguestfollowingobj! - .data![ - index] - .following! + guestFollowing.following! .fullName == null || - getguestfollowingobj! - .data![ - index] + guestFollowing .following! .fullName! .isEmpty ? text16w400_FCFCFC( "Regroup") : text16w400_FCFCFC( - getguestfollowingobj! - .data![ - index] + guestFollowing .following! .fullName!), sizedBoxHeight(4.h), - getguestfollowingobj! - .data![ - index] - .following! + guestFollowing.following! .userName == null || - getguestfollowingobj! - .data![ - index] + guestFollowing .following! .userName! .isEmpty ? text12w400_FCFCFC_blur( "regroup") : text12w400_FCFCFC_blur( - getguestfollowingobj! - .data![ - index] + guestFollowing .following! .userName!) ], @@ -572,15 +539,17 @@ class _FollowingState extends State { const Spacer(), PopupMenuButton( surfaceTintColor: - const Color(0xFF222935), + const Color( + 0xFF222935), constraints: BoxConstraints .tightFor( width: 176.w), - offset: const Offset(0, 20), - color: - const Color(0xFF222935), + offset: + const Offset(0, 20), + color: const Color( + 0xFF222935), tooltip: "", itemBuilder: (BuildContext @@ -589,17 +558,17 @@ class _FollowingState extends State { PopupMenuItem( onTap: () async { - setState( - () { - unfollowid = - getguestfollowingobj!.data![index].following!.id ?? - 0; - // followingobj!.data!.removeAt(index); - getguestfollowingobj!.data!.removeWhere((item) => - item.following!.id == - unfollowid); - Uploadata(); - }); + // setState( + // () { + // unfollowid = + // getguestfollowingobj!.data![index].following!.id ?? + // 0; + // // followingobj!.data!.removeAt(index); + // getguestfollowingobj!.data!.removeWhere((item) => + // item.following!.id == + // unfollowid); + // Uploadata(); + // }); }, child: Padding( @@ -610,7 +579,7 @@ class _FollowingState extends State { Row( children: [ text14400white( - "Unfollow user"), + ""), const Spacer(), Image .asset( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart index ba8c3f2..5559c40 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Business/ProfileTabBusGuest.dart @@ -6,6 +6,7 @@ import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; +import 'package:regroup/Utils/Common/ShimmerCommon.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; @@ -44,11 +45,13 @@ class _profiletabBusGestState extends State { future: guestBusfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( - child: CircularProgressIndicator( - color: Colors.blue, - ), - ); + return ShimmerCommon(); + + // Center( + // child: CircularProgressIndicator( + // color: Colors.blue, + // ), + // ); } if (snapshot.hasError) { @@ -297,7 +300,9 @@ class _profiletabBusGestState extends State { )), ), sizedBoxWidth(12.w), - text14400whiteblur("James Bothman"), + text14400whiteblur(guestGetProfileBus! + .data!.businessOwnerName ?? + "James Bothman"), ], ), sizedBoxHeight(20.h), @@ -319,7 +324,8 @@ class _profiletabBusGestState extends State { ), sizedBoxWidth(12.w), text14400whiteblur( - "www.exampledummywebsite.com"), + guestGetProfileBus!.data!.websiteLink ?? + "www.exampledummywebsite.com"), ], ), sizedBoxHeight(20.h), @@ -340,7 +346,8 @@ class _profiletabBusGestState extends State { )), ), sizedBoxWidth(12.w), - text14400whiteblur( + text14400whiteblur(guestGetProfileBus! + .data!.businessLocation ?? "Elm street london, United Kingdom"), ], ), @@ -365,7 +372,13 @@ class _profiletabBusGestState extends State { // text14400whiteblur(getEditProfileIndi! // .data!.interest! // .join(', ')), - text14400whiteblur("Founded at : 2010"), + guestGetProfileBus!.data!.businessType! + .createdAt != + null + ? text14400whiteblur( + ' Founded at : ${guestGetProfileBus!.data!.businessType!.createdAt}') + : text14400whiteblur( + "Founded at : 2010") ], ), sizedBoxHeight(30.h), @@ -402,6 +415,25 @@ class _profiletabBusGestState extends State { sizedBoxHeight(20.h), Row( children: [ + GestureDetector( + onTap: () { + Get.back(); + }, + child: commonContainer( + width: 40.w, + height: 40.h, + borderwidth: 0.5, + boxShape: BoxShape.circle, + opacity1: 0.5, + opacity2: 0.6, + customWidget: Center( + child: Image.asset( + 'assets/images/png/ph_arrow-up-thin.png', + height: 25.h, + width: 25.w, + ), + )), + ), Spacer(), commonContainer( width: 40.w, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart index 1fef178..a44a330 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -498,38 +498,48 @@ class _ProfileTabIndGuestState extends State { ], ), sizedBoxHeight(20.h), - SizedBox( - height: 300.h, - child: ListView.builder( - shrinkWrap: true, - itemCount: guestGetProfileInd! - .data!.timelines!.length, - itemBuilder: (context, index) { - var abilities; - abilities = guestGetProfileInd!.data! - .timelines![index].abilities! - .map((e) => e.name) - .join(', '); - return commonTimelineCard( - imagePath: timeline[index] - ["imagePath"], - title: guestGetProfileInd! - .data! - .timelines![index] - .teamName ?? - '', - teamName: guestGetProfileInd! - .data! - .timelines![index] - .teamName ?? - '', - abilities: abilities, - startendDate: - "${guestGetProfileInd!.data!.timelines![index].startDate} - ${guestGetProfileInd!.data!.timelines![index].endDate} " ?? + guestGetProfileInd!.data!.timelines!.isEmpty + ? Padding( + padding: EdgeInsets.symmetric( + vertical: 30.h), + child: Center( + child: text18w700white( + "No Timeline Found")), + ) + : SizedBox( + height: 300.h, + child: ListView.builder( + shrinkWrap: true, + itemCount: guestGetProfileInd! + .data!.timelines!.length, + itemBuilder: (context, index) { + var abilities; + abilities = guestGetProfileInd! + .data! + .timelines![index] + .abilities! + .map((e) => e.name) + .join(', '); + return commonTimelineCard( + imagePath: timeline[index] + ["imagePath"], + title: guestGetProfileInd! + .data! + .timelines![index] + .teamName ?? '', - ); - }, - )), + teamName: guestGetProfileInd! + .data! + .timelines![index] + .teamName ?? + '', + abilities: abilities, + startendDate: + "${guestGetProfileInd!.data!.timelines![index].startDate} - ${guestGetProfileInd!.data!.timelines![index].endDate} " ?? + '', + ); + }, + )), sizedBoxHeight(30.h), Row( children: [ @@ -544,67 +554,89 @@ class _ProfileTabIndGuestState extends State { ], ), sizedBoxHeight(20.h), - SizedBox( - height: 85.h, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - itemCount: guestGetProfileInd! - .data!.certifications!.length ?? - certificationData.length, - itemBuilder: (context, index) { - var certifiData = guestGetProfileInd! - .data!.certifications![index]; - return Padding( - padding: EdgeInsets.only(right: 20.w), - child: certificationCardTile( - imagePath: certifiData - .certificationImage ?? - certificationData[index] - ["imagePath"], - title: certifiData - .certificationName ?? - certificationData[index] - ["title"], - subtitle: certifiData - .certificationReason ?? - certificationData[index] - ["subtitle"], - date: - ("Issued ${certifiData.certificationDate}") ?? - (certificationData[index] - ["date"])), - ); - }, - ), - ), + guestGetProfileInd! + .data!.certifications!.isEmpty + ? Padding( + padding: EdgeInsets.symmetric( + vertical: 30.h), + child: Center( + child: text18w700white( + "No Certifications Found")), + ) + : SizedBox( + height: 85.h, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: guestGetProfileInd!.data! + .certifications!.length ?? + certificationData.length, + itemBuilder: (context, index) { + var certifiData = + guestGetProfileInd!.data! + .certifications![index]; + return Padding( + padding: EdgeInsets.only( + right: 20.w), + child: certificationCardTile( + imagePath: certifiData + .certificationImage ?? + certificationData[index] + ["imagePath"], + title: certifiData + .certificationName ?? + certificationData[index] + ["title"], + subtitle: certifiData + .certificationReason ?? + certificationData[index] + ["subtitle"], + date: + ("Issued ${certifiData.certificationDate}") ?? + (certificationData[ + index] + ["date"])), + ); + }, + ), + ), sizedBoxHeight(30.h), text18w400white("Subgroups"), ]), ), sizedBoxHeight(20.h), - SizedBox( - height: 190.h, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - padding: EdgeInsets.only(left: 16.w), - itemCount: guestGetProfileInd! - .data!.myJoinedSubgroups!.length, - itemBuilder: (context, index) { - var subGroupData = guestGetProfileInd!.data! - .myJoinedSubgroups![index].subGroupData!; - return Padding( - padding: EdgeInsets.only(right: 20.w), - child: profilecardtile( - imagePath: subGroupData.subGroupImage ?? - cardtile[index]["imagePath"], - title: subGroupData.title ?? - cardtile[index]["title"]), - ); - }, - ), - ), + guestGetProfileInd!.data!.myJoinedSubgroups!.isEmpty + ? Padding( + padding: EdgeInsets.symmetric(vertical: 30.h), + child: Center( + child: text18w700white( + "No Subgroups Found")), + ) + : SizedBox( + height: 190.h, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: EdgeInsets.only(left: 16.w), + itemCount: guestGetProfileInd! + .data!.myJoinedSubgroups!.length, + itemBuilder: (context, index) { + var subGroupData = guestGetProfileInd! + .data! + .myJoinedSubgroups![index] + .subGroupData!; + return Padding( + padding: EdgeInsets.only(right: 20.w), + child: profilecardtile( + imagePath: subGroupData + .subGroupImage ?? + cardtile[index]["imagePath"], + title: subGroupData.title ?? + cardtile[index]["title"]), + ); + }, + ), + ), sizedBoxHeight(20.h), Padding( padding: EdgeInsets.only(left: 16.w), @@ -635,6 +667,25 @@ class _ProfileTabIndGuestState extends State { sizedBoxHeight(20.h), Row( children: [ + GestureDetector( + onTap: () { + Get.back(); + }, + child: commonContainer( + width: 40.w, + height: 40.h, + borderwidth: 0.5, + boxShape: BoxShape.circle, + opacity1: 0.5, + opacity2: 0.6, + customWidget: Center( + child: Image.asset( + 'assets/images/png/ph_arrow-up-thin.png', + height: 25.h, + width: 25.w, + ), + )), + ), const Spacer(), commonContainer( width: 40.w, diff --git a/lib/Utils/Common/CustomTextformfield.dart b/lib/Utils/Common/CustomTextformfield.dart index f932031..013f769 100644 --- a/lib/Utils/Common/CustomTextformfield.dart +++ b/lib/Utils/Common/CustomTextformfield.dart @@ -6,6 +6,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:glassmorphism/glassmorphism.dart'; +import 'package:glassmorphism_ui/glassmorphism_ui.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; @@ -79,32 +80,24 @@ class _CustomTextFormFieldState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - GlassmorphicContainer( + GlassContainer( + height: 50.h, width: double.infinity, - height: 50, - borderRadius: 30, - blur: 6, - alignment: Alignment.bottomCenter, - border: 0.8, - linearGradient: LinearGradient( + gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ const Color(0xFFffffff).withOpacity(widget.opacity1), - const Color(0xFFFFFFFF).withOpacity(widget.opacity2), + const Color(0xFFFFFFFF).withOpacity(widget.opacity1), ], stops: const [ 0.1, 1, ]), - borderGradient: const LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff434A53), - Color(0xFF434A53), - ], - ), + blur: 6, + opacity: 1, + borderRadius: BorderRadius.circular(30.r), + border: Border.all(color: Color(0xff434A53), width: 0.8), child: TextFormField( style: TextStyle( fontSize: 16.sp, color: Colors.white, fontFamily: 'Helvetica'), @@ -254,14 +247,10 @@ class _CustomTextFormField2State extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - GlassmorphicContainer( - width: double.infinity, + GlassContainer( height: 100.h, - borderRadius: 10, - blur: 6, - alignment: Alignment.bottomCenter, - border: 0.8, - linearGradient: LinearGradient( + width: double.infinity, + gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ @@ -272,14 +261,10 @@ class _CustomTextFormField2State extends State { 0.1, 1, ]), - borderGradient: const LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xff434A53), - Color(0xFF434A53), - ], - ), + blur: 6, + opacity: 1, + borderRadius: BorderRadius.circular(10.r), + border: Border.all(color: Color(0xff434A53), width: 0.8), child: TextFormField( cursorColor: Colors.red, initialValue: widget.value, -- 2.34.1 From 417d3e6a63ab5605d4c7bf737858e797a34a7413 Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Tue, 23 Jul 2024 19:19:39 +0530 Subject: [PATCH 06/21] sprint 2 tasks completed --- lib/Common/api_urls.dart | 8 + .../Certificate/AddCertificate.dart | 398 +++++++ .../ProfileTab/Certificate/Certificate.dart | 192 +++- .../EditProfile/Model/GetEditProfileIndi.dart | 67 +- .../EditProfile/View/ProfileTab.dart | 430 ++++++-- .../ProfileTab/Model/accountSessionModel.dart | 89 ++ .../ProfileTab/My Network/MyNetwork.dart | 992 +++++++++--------- .../ProfileTab/Settings/AccountSessions.dart | 89 +- .../ProfileTab/TimeLine/AddTimeline.dart | 662 ++++-------- .../view_model/profileGetmethod.dart | 14 + .../view_model/profilePostmethod.dart | 22 + lib/Utils/Common/CommonDropdown.dart | 95 +- lib/main.dart | 2 +- .../Signup/view_model/postmethod.dart | 11 + lib/onboarding/SplashScreen.dart | 73 +- lib/resources/routes/route_name.dart | 3 + lib/resources/routes/routes.dart | 7 + 17 files changed, 2037 insertions(+), 1117 deletions(-) create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart diff --git a/lib/Common/api_urls.dart b/lib/Common/api_urls.dart index dfb6276..73385c8 100644 --- a/lib/Common/api_urls.dart +++ b/lib/Common/api_urls.dart @@ -75,6 +75,14 @@ class ApiUrls { static const postremovetimeline = "${baseUrl}delete-timeline"; + static const postremovecertification = "${baseUrl}delete-certification"; + + static const postcertification = "${baseUrl}store-certification"; + + static const getaccountsessions = "${baseUrl}get-account-session"; + + static const postuserdevice = "${baseUrl}store-account-session"; + diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart new file mode 100644 index 0000000..b7c02ec --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart @@ -0,0 +1,398 @@ +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart' hide MultipartFile, FormData; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; +import 'package:regroup/Utils/Common/CommonAppbar.dart'; +import 'package:regroup/Utils/Common/CustomNextButton.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/ImageUpload.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; +import 'package:path/path.dart' as path; + +class AddCertificate extends StatefulWidget { + const AddCertificate({super.key}); + + @override + State createState() => _AddCertificateState(); +} + +class _AddCertificateState extends State { + final GlobalKey _formkey = GlobalKey(); + TextEditingController certicationname = TextEditingController(); + TextEditingController certificationreason = TextEditingController(); + TextEditingController datecontroller = TextEditingController(); + + TextEditingController querycontroller = TextEditingController(); + + DateTime? _selectedDate; + + Future _selectDate(BuildContext context) async { + DateTime yesterday = DateTime.now().subtract(const Duration(days: 1)); + DateTime eighteenYearsAgo = + DateTime.now().subtract(const Duration(days: 365 * 18)); + + final ThemeData customTheme = Theme.of(context).copyWith( + colorScheme: const ColorScheme.light( + primary: Color(0xFFD90B2E), + surfaceTint: Color(0xFF222935), + surface: Color(0xFF222935), + onPrimary: Colors.white, + onSurface: Colors.white, + onSecondary: Colors.white), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: const Color(0xFFD90B2E), + ), + )); + + final DateTime? pickedDate = await showDatePicker( + context: context, + initialDate: yesterday, + firstDate: DateTime(1950), + lastDate: DateTime(2026), + builder: (BuildContext context, Widget? child) { + return Theme( + data: customTheme, + // ThemeData.light().copyWith( + // colorScheme: ColorScheme.dark( + // primary: Color(0XFF222935).withOpacity(0.60), + // onPrimary: Colors.white, // Change text color + // ), + // textButtonTheme: TextButtonThemeData( + // style: TextButton.styleFrom( + // foregroundColor: Colors.white, // Change button text color + // ), + // ), + // dialogBackgroundColor: Color(0XFF222935) + // .withOpacity(0.60), // Change dialog background color + // ), + child: child!, + ); + }, + ); + + if (pickedDate != null) { + // if (pickedDate.isBefore(eighteenYearsAgo)) { + setState(() { + _selectedDate = pickedDate; + datecontroller.text = + "${_selectedDate!.year.toString().padLeft(2, '0')}-${_selectedDate!.month.toString().padLeft(2, '0')}-${_selectedDate!.day.toString().padLeft(2, '0')}"; + }); + // } + } + } + + List filePath = []; + bool isImageAdded = false; + + UploadData() async { + utils.loader(); + List certificatelist = []; + + for (var file in filePath.where((file) => file != null)) { + certificatelist.add( + await MultipartFile.fromFile( + file!.path, + filename: path.basename(file.path), + ), + ); + } + FormData formdata = FormData.fromMap({ + "certification_name": certicationname.text, + "certification_reason": certificationreason.text, + "certification_date": datecontroller.text, + "certification_image": certificatelist[0], + }); + final data = await Profilepostmethod().postCertification(formdata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + Get.back(); + return utils.showToast(data.message); + } else { + Get.back(); + return utils.showToast(data.message); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "Add certifications", + ), + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SingleChildScrollView( + child: Form( + key: _formkey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + text16400white("Certification name"), + sizedBoxHeight(16.h), + CustomTextFormField( + leadingIcon: Container( + height: 17.h, + width: 18.w, + child: Center( + child: Image.asset( + "assets/images/png/Frame 24.png", + height: 17.h, + width: 18.w, + fit: BoxFit.cover, + ), + ), + ), + validator: (value) { + if (value!.isEmpty) { + return 'Enter your certification name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + hintText: "Enter certification name", + textEditingController: certicationname, + ), + sizedBoxHeight(10.h), + text16400white("Certification reason"), + sizedBoxHeight(16.h), + CustomTextFormField( + leadingIcon: Container( + height: 17.h, + width: 18.w, + child: Center( + child: Image.asset( + "assets/images/png/Frame 24.png", + height: 17.h, + width: 18.w, + fit: BoxFit.cover, + ), + ), + ), + validator: (value) { + if (value!.isEmpty) { + return 'Enter your certification reason '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + hintText: "Enter certification reason", + textEditingController: certificationreason, + ), + sizedBoxHeight(10.h), + text16400white("Certification date"), + sizedBoxHeight(16.h), + CustomTextFormField( + textEditingController: datecontroller, + readonly: true, + onTap: () { + _selectDate(context); + }, + // texttype: TextInputType.text, + hintText: "Enter your certification date", + leadingIcon: + // const Icon(Icons.mail_outline), + Image.asset( + width: 22.w, + height: 17.h, + 'assets/images/png/dateimage.png', + ), + // validatorText: "Enter date of birth", + validator: (value) { + if (value!.isEmpty) { + return 'Enter your certification date'; + } + return null; + }, + ), + sizedBoxHeight(10.h), + text16400white("Certification image"), + sizedBoxHeight(16.h), + filePath.isNotEmpty && isImageAdded + ? Container( + height: 167.h, + width: double.infinity, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(0.98, -0.21), + end: Alignment(-0.98, 0.21), + colors: [ + Colors.white + .withOpacity(0.30000001192092896), + Colors.white + .withOpacity(0.2800000011920929) + ], + ), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.50, + color: Color(0xFF7E7E7E)), + borderRadius: BorderRadius.circular(10), + ), + ), + child: Stack(children: [ + Image.file( + filePath[0]!, + fit: BoxFit.cover, + width: double.infinity, + ), + Positioned( + // top: 0, + // left: 0, + right: 12, + bottom: 12, + child: GestureDetector( + onTap: () { + // Clear the list and show the upload button + filePath.clear(); + isImageAdded = false; + setState(() {}); + }, + child: Container( + width: 27, + height: 27, + decoration: ShapeDecoration( + color: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 5)), + ), + child: Icon( + Icons.delete_outline_outlined, + color: Colors.white, + ))), + ), + // ), + ]), + ) + : GestureDetector( + // onTap: () { + // ImageUploadBottomSheet().showModal( + // context, + // false, + // (result) { + // var file = File(result); + // filePath.add(file); + // // isImageAdded = true; + // setState(() { + // isImageAdded = true; + + // }); + // }, + // ); + // }, + onTap: () { + ImageUploadBottomSheet().showModal( + context, + false, + (result) { + var file = File(result); + + filePath.add(file); + isImageAdded = true; + setState(() { + // Navigator.of(context).pop(); + Get.back(); + }); + }, + ); + }, + child: Container( + width: double.infinity, + height: 167, + decoration: ShapeDecoration( + gradient: LinearGradient( + begin: Alignment(0.98, -0.21), + end: Alignment(-0.98, 0.21), + colors: [ + Colors.white + .withOpacity(0.30000001192092896), + Colors.white + .withOpacity(0.2800000011920929) + ], + ), + shape: RoundedRectangleBorder( + side: BorderSide( + width: 0.50, + color: Color(0xFF7E7E7E)), + borderRadius: BorderRadius.circular(10), + ), + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Image.asset( + 'assets/images/png/onlycamera.png'), + sizedBoxHeight(5.h), + Text( + 'Upload certification \nimage', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, + fontFamily: 'Poppins', + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), + sizedBoxHeight(50.h), + CustomButton( + onPressed: () { + // final isValid = + // _formkey.currentState?.validate(); + if (certicationname.text.isBlank! && + certificationreason.text.isBlank! && + datecontroller.text.isBlank! && + filePath.isEmpty) { + utils.showToast("Please fill all fields"); + } else { + UploadData(); + } + }, + text: "Send") + ]), + ), + )) + ])), + ); + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart index 7a7a94f..370bcb3 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:regroup/Common/CommonGlassmorphism.dart'; -import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; -import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; @@ -45,57 +43,143 @@ class _CertificateState extends State { @override Widget build(BuildContext context) { return Scaffold( - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - appBar: CommonAppbar( - titleTxt: "Certifications/Qualifications", - ), - resizeToAvoidBottomInset: false, - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Column(children: [ - sizedBoxHeight(25.h), - Container( - height: 600.h, - child: GridView.builder( - scrollDirection: Axis.vertical, - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 20, - crossAxisSpacing: 8, - childAspectRatio: 0.65, + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "Certifications/Qualifications", + ), + resizeToAvoidBottomInset: false, + body: FutureBuilder( + future: EditProfileApi().getEditProfileIndividual(), + builder: (ctx, snapshot) { + if (snapshot.data == null) { + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: CircularProgressIndicator( + color: Color(0xFFC18948), + ), + ) + ], + ); + } + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + return Center( + child: Text( + '${snapshot.error} occured', + style: TextStyle(fontSize: 18.spMin), + ), + ); + } + } + return getEditProfileIndi!.data!.certifications!.isEmpty + ? _buildNoDataBody(context) + : _buildBody(context); + }, + ), + ); + } + + Widget _buildNoDataBody(context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], + ), + ); + } + + Widget _buildBody(context) { + return Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column(children: [ + sizedBoxHeight(25.h), + Container( + height: 600.h, + child: GridView.builder( + scrollDirection: Axis.vertical, + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + mainAxisSpacing: 20, + crossAxisSpacing: 8, + childAspectRatio: 0.65, + ), + itemCount: + getEditProfileIndi!.data!.certifications!.length, + itemBuilder: (context, index) { + return Column( + // mainAxisAlignment: MainAxisAlignment.start, + children: [ + getEditProfileIndi!.data!.certifications![index] + .certificationImage == + null || + getEditProfileIndi! + .data! + .certifications![index] + .certificationImage! + .isEmpty + ? Image.asset( + CertificateData[index]["imagePath"], + height: 100.h, + width: 105.w, + ) + : Image.network( + getEditProfileIndi! + .data! + .certifications![index] + .certificationImage!, + height: 100.h, + width: 105.w, + ), + Expanded( + child: Center( + child: text14w400_FCFCFC( + getEditProfileIndi! + .data! + .certifications![index] + .certificationName == + null || + getEditProfileIndi! + .data! + .certifications![index] + .certificationName! + .isEmpty + ? CertificateData[index]["text"] + : getEditProfileIndi! + .data! + .certifications![index] + .certificationName, + textAlign: TextAlign.center, + ), ), - itemCount: CertificateData.length, - itemBuilder: (context, index) { - return Column( - children: [ - Image.asset( - CertificateData[index]["imagePath"], - height: 100.h, - width: 105.w, - ), - Expanded( - child: Center( - child: text14w400_FCFCFC( - CertificateData[index]["text"], - textAlign: TextAlign.center, - ), - ), - ), - ], - ); - }), - ) - ]))) - ])); + ), + ], + ); + }), + ) + ]))) + ]); } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart index 2422a2a..339e49d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart @@ -29,7 +29,8 @@ class Data { int? id; String? userName; String? fullName; - String? profileImage; + // String? profileImage; + String? profilePhoto; String? gender; String? dateOfBirth; List? interest; @@ -43,13 +44,16 @@ class Data { List? timelines; int? accountVisibility; List? myJoinedSubgroups; + List? certifications; + int? daysBeforeJoined; Data( {this.id, this.userName, this.fullName, - this.profileImage, + // this.profileImage, + this.profilePhoto, this.gender, this.dateOfBirth, this.interest, @@ -62,14 +66,17 @@ class Data { this.follows, this.timelines, this.accountVisibility, - this.myJoinedSubgroups + this.myJoinedSubgroups, + this.certifications, + this.daysBeforeJoined }); Data.fromJson(Map json) { id = json['id']; userName = json['user_name']; fullName = json['full_name']; - profileImage = json['profile_image']; + // profileImage = json['profile_image']; + profilePhoto = json['profile_photo']; gender = json['gender']; dateOfBirth = json['date_of_birth']; if (json['interest'] != null) { @@ -99,6 +106,13 @@ class Data { myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); }); } + if (json['certifications'] != null) { + certifications = []; + json['certifications'].forEach((v) { + certifications!.add(new Certifications.fromJson(v)); + }); + } + daysBeforeJoined = json['days_before_joined']; } Map toJson() { @@ -106,7 +120,8 @@ class Data { data['id'] = this.id; data['user_name'] = this.userName; data['full_name'] = this.fullName; - data['profile_image'] = this.profileImage; + // data['profile_image'] = this.profileImage; + data['profile_photo'] = this.profilePhoto; data['gender'] = this.gender; data['date_of_birth'] = this.dateOfBirth; if (this.interest != null) { @@ -129,6 +144,11 @@ class Data { data['my_joined_subgroups'] = this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); } + if (this.certifications != null) { + data['certifications'] = + this.certifications!.map((v) => v.toJson()).toList(); + } + data['days_before_joined'] = this.daysBeforeJoined; return data; } } @@ -300,3 +320,40 @@ class SubGroupData { return data; } } + +class Certifications { + int? id; + String? certificationName; + String? certificationImage; + String? certificationReason; + String? certificationDate; + int? iamPrincipalXid; + + Certifications( + {this.id, + this.certificationName, + this.certificationImage, + this.certificationReason, + this.certificationDate, + this.iamPrincipalXid}); + + Certifications.fromJson(Map json) { + id = json['id']; + certificationName = json['certification_name']; + certificationImage = json['certification_image']; + certificationReason = json['certification_reason']; + certificationDate = json['certification_date']; + iamPrincipalXid = json['iam_principal_xid']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['certification_name'] = this.certificationName; + data['certification_image'] = this.certificationImage; + data['certification_reason'] = this.certificationReason; + data['certification_date'] = this.certificationDate; + data['iam_principal_xid'] = this.iamPrincipalXid; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index 1483566..ee0ff8d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_reaction_button/flutter_reaction_button.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -7,6 +8,7 @@ import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/MainScreen.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; @@ -152,6 +154,8 @@ class _ProfileTabState extends State { int? timelineremoveid; + int? certificationsremoveid; + RemoveTimelineUploadata() async { utils.loader(); Map updata = { @@ -169,6 +173,23 @@ class _ProfileTabState extends State { } } + RemoveCertificationUploadata() async { + utils.loader(); + Map updata = { + "certification_id": certificationsremoveid, + }; + final data = await Profilepostmethod().postRemoveCertification(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + print("block done"); + return utils.showToast(data.message); + } else { + Get.back(); + print("block not done"); + return utils.showToast(data.message); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -265,13 +286,13 @@ class _ProfileTabState extends State { '@${getEditProfileIndi!.data!.userName}' ?? "@edward_01"), sizedBoxWidth(5.w), - Icon( - Icons.circle, - size: 5.sp, - color: Colors.white, - ), - sizedBoxWidth(5.w), - text18w400white("2,124 days") + // Icon( + // Icons.circle, + // size: 5.sp, + // color: Colors.white, + // ), + // sizedBoxWidth(5.w), + // text18w400white("2,124 days") ], ), sizedBoxHeight(15.h), @@ -405,7 +426,6 @@ class _ProfileTabState extends State { ], ), sizedBoxHeight(20.h), - getEditProfileIndi!.data!.timelines!.isEmpty ? Center( child: @@ -445,15 +465,15 @@ class _ProfileTabState extends State { getEditProfileIndi!.data! .timelines![index]; - List> - abilities = - timeline.abilities! - .map((ability) => { - 'id': ability.id, - 'name': - ability.name, - }) - .toList(); + // List> + // abilities = + // timeline.abilities! + // .map((ability) => { + // 'id': ability.id, + // 'name': + // ability.name, + // }) + // .toList(); return // commonTimelineCard( // imagePath: getEditProfileIndi @@ -547,9 +567,9 @@ class _ProfileTabState extends State { children: [ Row( children: [ - getEditProfileIndi?.data?.profileImage == null || getEditProfileIndi!.data!.profileImage!.isEmpty + getEditProfileIndi?.data?.profilePhoto == null || getEditProfileIndi!.data!.profilePhoto!.isEmpty ? CircleAvatar(radius: 10.r, backgroundImage: AssetImage('assets/images/png/cimg1.png')) - : CircleAvatar(radius: 10.r, backgroundImage: NetworkImage(getEditProfileIndi!.data!.profileImage!)), + : CircleAvatar(radius: 10.r, backgroundImage: NetworkImage(getEditProfileIndi!.data!.profilePhoto!)), sizedBoxWidth( 8.w), getEditProfileIndi!.data!.timelines![index].clubName == null || getEditProfileIndi!.data!.timelines![index].clubName!.isEmpty @@ -557,40 +577,59 @@ class _ProfileTabState extends State { : text14700white(getEditProfileIndi!.data!.timelines![index].clubName!) ], ), - InkWell( - onTap: - () { - // setState( - // () { - // timelineremoveid = - // getEditProfileIndi!.data!.timelines![index].id ?? 0; - // getEditProfileIndi!.data!.timelines!.removeWhere((item) => - // item.id! == - // timelineremoveid); - // // .removeAt(index); - // RemoveTimelineUploadata(); - // }); - - Get.toNamed(RouteName.addtimeline, arguments: { - 'id': getEditProfileIndi!.data!.timelines![index].id, - 'edit': true, - }); - }, - child: - SizedBox( - width: - 20.w, - height: - 20.h, - child: - Image.asset( - "assets/images/png/iconamoon_edit-thin.png", - height: - 14.h, - width: - 14.w, + Row( + children: [ + InkWell( + onTap: + () { + setState(() { + timelineremoveid = getEditProfileIndi!.data!.timelines![index].id ?? 0; + getEditProfileIndi!.data!.timelines!.removeWhere((item) => item.id! == timelineremoveid); + // .removeAt(index); + RemoveTimelineUploadata(); + }); + }, + child: SizedBox( + width: 20.w, + height: 20.h, + child: Icon( + Icons.delete, + color: Colors.white, + )), ), - ), + sizedBoxWidth( + 10.w), + InkWell( + onTap: + () { + // setState( + // () { + // timelineremoveid = + // getEditProfileIndi!.data!.timelines![index].id ?? 0; + // getEditProfileIndi!.data!.timelines!.removeWhere((item) => + // item.id! == + // timelineremoveid); + // // .removeAt(index); + // RemoveTimelineUploadata(); + // }); + + Get.toNamed(RouteName.addtimeline, arguments: { + 'id': getEditProfileIndi!.data!.timelines![index].id, + 'edit': true, + }); + }, + child: + SizedBox( + width: 20.w, + height: 20.h, + child: Image.asset( + "assets/images/png/iconamoon_edit-thin.png", + height: 14.h, + width: 14.w, + ), + ), + ) + ], ) ], ), @@ -630,33 +669,59 @@ class _ProfileTabState extends State { .teamName!), sizedBoxHeight( 10.h), - - startToEnd - .isEmpty + startToEnd + .isEmpty ? text12400white( 'No date') : text12400white( startToEnd), sizedBoxHeight( 10.h), - - abilities + getEditProfileIndi!.data!.timelines![index].abilities == + null || + getEditProfileIndi! + .data! + .timelines![ + index] + .abilities! .isEmpty ? text10400whiteblur( 'No data') : - // ListView.builder( - // shrinkWrap: true, - // scrollDirection: Axis.horizontal, - // padding: EdgeInsets.only(left: 16.w), - // itemCount: abilities.length, - // itemBuilder: (context, index) { - // return - // text10400whiteblur(abilities.toString()); - // }, - // ), + // Container( + // height: + // 30.h, // Adjust the height as needed + // child: + // ListView.builder( + // shrinkWrap: + // true, + // scrollDirection: + // Axis.horizontal, + // itemCount: + // getEditProfileIndi!.data!.timelines![index].abilities!.length, + // itemBuilder: + // (context, index) { + // String abilityName = getEditProfileIndi!.data!.timelines![index].abilities![index].name!; + // // String abilitiesString = abilities.map((ability) => ability['name']).join(', '); + // return Padding( + // padding: EdgeInsets.only(right: 8.w), + // child: text10400whiteblur(abilityName), + // ); + // // if (index < abilities.length) { + // // // String abilityName = abilities[index]['name']; + // // String abilitiesString = abilities.map((ability) => ability['name']).join(', '); + // // return Padding( + // // padding: EdgeInsets.only(right: 8.w), + // // child: text10400whiteblur(abilitiesString), + // // ); + // // } else { + // // return SizedBox(); + // // } + // }, + // ), + // ), Container( height: 30.h, // Adjust the height as needed @@ -667,18 +732,14 @@ class _ProfileTabState extends State { scrollDirection: Axis.horizontal, itemCount: - abilities.length, + getEditProfileIndi!.data!.timelines![index].abilities!.length, itemBuilder: - (context, index) { - if (index < abilities.length) { - String abilityName = abilities[index]['name']; - return Padding( - padding: EdgeInsets.only(right: 8.w), - child: text10400whiteblur(abilityName), - ); - } else { - return SizedBox(); - } + (context, innerIndex) { + List abilityName = getEditProfileIndi!.data!.timelines![index].abilities![innerIndex].name!.split('pattern'); + return Padding( + padding: EdgeInsets.only(right: 8.w), + child: text10400whiteblur(abilityName.toString()), + ); }, ), ), @@ -695,12 +756,215 @@ class _ProfileTabState extends State { }, )), sizedBoxHeight(30.h), - ]), ), Padding( padding: EdgeInsets.symmetric(horizontal: 16.w), - + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + text18w700white( + "Certifications/Qualifications"), + Spacer(), + InkWell( + onTap: () { + Get.toNamed( + RouteName.certificate, + ); + }, + child: text16400white('View more')) + ], + ), + sizedBoxHeight(20.h), + getEditProfileIndi! + .data!.certifications!.isEmpty + ? Center( + child: text16400white( + "No certificates added")) + : SizedBox( + height: 100.h, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + // padding: + // EdgeInsets.only(left: 16.w), + physics: ScrollPhysics(), + itemCount: getEditProfileIndi! + .data!.certifications!.length, + itemBuilder: (context, index) { + return Row( + children: [ + commonGlassUI( + width: 266.w, + height: 70.h, + borderRadius: + BorderRadius + .circular(10.r), + customWidget: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 16.w, + vertical: + 5.h), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .center, + children: [ + getEditProfileIndi! + .data! + .certifications![ + index] + .certificationImage == + null || + getEditProfileIndi! + .data! + .certifications![ + index] + .certificationImage! + .isEmpty + ? Image.asset( + 'assets/images/png/image 17.png', + width: + 57.w, + height: + 40.h, + ) + : Image + .network( + getEditProfileIndi! + .data! + .certifications![ + index] + .certificationImage!, + width: + 77.w, + height: + 100.h, + ), + sizedBoxWidth( + 20.w), + Column( + crossAxisAlignment: + CrossAxisAlignment + .center, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + getEditProfileIndi!.data!.certifications![index].certificationName == + null || + getEditProfileIndi! + .data! + .certifications![ + index] + .certificationName! + .isEmpty + ? text12400white( + 'Regroup') + : text12400white(getEditProfileIndi! + .data! + .certifications![ + index] + .certificationName!), + sizedBoxHeight( + 4.h), + getEditProfileIndi!.data!.certifications![index].certificationReason == + null || + getEditProfileIndi! + .data! + .certifications![ + index] + .certificationReason! + .isEmpty + ? text9400white( + 'Regroup') + : text9400white(getEditProfileIndi! + .data! + .certifications![ + index] + .certificationName!), + sizedBoxHeight( + 4.h), + getEditProfileIndi!.data!.certifications![index].certificationDate == + null || + getEditProfileIndi! + .data! + .certifications![index] + .certificationDate! + .isEmpty + ? Text( + 'Regroup', + style: TextStyle( + fontSize: 9.sp, + fontWeight: FontWeight.w400, + color: Color(0xffFFFFFF).withOpacity(0.70), + fontFamily: 'Helvetica'), + ) + : Text( + 'Issued ${DateFormat('MMM yyyy').format(DateTime.parse(getEditProfileIndi!.data!.certifications![index].certificationDate!))}', + style: TextStyle( + fontSize: 9.sp, + fontWeight: FontWeight.w400, + color: Color(0xffFFFFFF).withOpacity(0.70), + fontFamily: 'Helvetica'), + ) + ], + ), + const Spacer(), + InkWell( + onTap: () { + setState( + () { + certificationsremoveid = + getEditProfileIndi!.data!.certifications![index].id ?? + 0; + getEditProfileIndi! + .data! + .certifications! + .removeWhere((item) => + item.id! == + certificationsremoveid); + // .removeAt(index); + RemoveCertificationUploadata(); + }); + }, + child: Icon( + Icons + .delete, + color: Colors + .white, + )) + ], + ), + )), + sizedBoxWidth(20.w), + ], + ); + }, + )), + sizedBoxHeight(10.h), + InkWell( + onTap: () { + Get.toNamed( + RouteName.addcertificate, + ); + }, + child: Align( + alignment: Alignment.centerRight, + child: text16400white( + 'Add certificate'))), + sizedBoxHeight(10.h), + ]), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -716,15 +980,12 @@ class _ProfileTabState extends State { shrinkWrap: true, scrollDirection: Axis.horizontal, padding: EdgeInsets.only(left: 16.w), - itemCount: getEditProfileIndi! .data!.myJoinedSubgroups!.length, - itemBuilder: (context, index) { return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( - imagePath: getEditProfileIndi! .data! .myJoinedSubgroups![index] @@ -744,7 +1005,6 @@ class _ProfileTabState extends State { }, ), ), - normalcardtile( profileImg: 'assets/images/png/Ellipse 48.png', title: 'Jocelyn Dokidis', @@ -1176,7 +1436,6 @@ class _ProfileTabState extends State { ); } - Widget commonTimelineCard({ required String? imagePath, required String? title, @@ -1186,7 +1445,6 @@ class _ProfileTabState extends State { required int? id, required List>? abilities, }) { - return Row( children: [ Container( diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart new file mode 100644 index 0000000..0714af3 --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart @@ -0,0 +1,89 @@ +class GetAccountSessionsModel { + String? status; + int? statusCode; + String? message; + List? data; + + GetAccountSessionsModel( + {this.status, this.statusCode, this.message, this.data}); + + GetAccountSessionsModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + String? deviceName; + String? ipAddress; + String? country; + String? state; + String? city; + String? zip; + String? isp; + String? lat; + String? lon; + String? timezone; + + Data( + {this.id, + this.deviceName, + this.ipAddress, + this.country, + this.state, + this.city, + this.zip, + this.isp, + this.lat, + this.lon, + this.timezone}); + + Data.fromJson(Map json) { + id = json['id']; + deviceName = json['device_name']; + ipAddress = json['ip_address']; + country = json['country']; + state = json['state']; + city = json['city']; + zip = json['zip']; + isp = json['isp']; + lat = json['lat']; + lon = json['lon']; + timezone = json['timezone']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['device_name'] = this.deviceName; + data['ip_address'] = this.ipAddress; + data['country'] = this.country; + data['state'] = this.state; + data['city'] = this.city; + data['zip'] = this.zip; + data['isp'] = this.isp; + data['lat'] = this.lat; + data['lon'] = this.lon; + data['timezone'] = this.timezone; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart index 0f4d4c7..b0d3736 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart @@ -28,48 +28,51 @@ class MyNetwork extends StatefulWidget { class _MyNetworkState extends State { @override Widget build(BuildContext context) { - return Scaffold( - // key: _scaffoldKey1, - resizeToAvoidBottomInset: false, - backgroundColor: Color(0xFF222935), - extendBody: true, - appBar: CommonAppbar( - titleTxt: "My networks", - ), - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + // key: _scaffoldKey1, + resizeToAvoidBottomInset: false, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "My networks", ), - Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - sizedBoxHeight(16.h), - Expanded( - child: DefaultTabController( - length: 2, - // initialIndex: selectedIndex.value, - child: Column(children: [ - CommonTabBar(tabs: const [ - Tab( - text: 'Followers', + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + sizedBoxHeight(16.h), + Expanded( + child: DefaultTabController( + length: 2, + // initialIndex: selectedIndex.value, + child: Column(children: [ + CommonTabBar(tabs: const [ + Tab( + text: 'Followers', + ), + Tab( + text: 'Following', + ), + ]), + Expanded( + child: TabBarView( + children: [ + followersTab(), + followingTab(), + ], + ), ), - Tab( - text: 'Following', - ), - ]), - Expanded( - child: TabBarView( - children: [ - followersTab(), - followingTab(), - ], - ), - ), - ])), - ) - ]) - ])); + ])), + ) + ]) + ])), + ); } } @@ -170,239 +173,258 @@ class _followersTabState extends State { @override Widget build(BuildContext context) { - return Column( - children: [ - sizedBoxHeight(25.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", - height: 23, - width: 23, + return ListView( + scrollDirection: Axis.vertical, + physics: ScrollPhysics(), + children: [ + Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), + ), + texttype: TextInputType.text, + inputFormatters: [ + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + Profilegetmethod().getFollowers(value, + streamController: searchcontroller); + }, + hintText: "Search people", ), ), - ), - texttype: TextInputType.text, - inputFormatters: [ - RemoveEmojiInputFormatter(), - ], - onInput: (value) { - Profilegetmethod() - .getFollowers(value, streamController: searchcontroller); - }, - hintText: "Search people", - ), - ), - sizedBoxHeight(20.h), - StreamBuilder( - stream: searchcontroller.stream, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - // Display shimmer effect while waiting for data - return Expanded( - child: Center(child: CircularProgressIndicator())); - } else if (snapshot.hasError) { - // Handle error state - return Center( - child: Text( - '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), - ), - ); - } else { - // Data has been loaded, show actual UI - return followersobj!.data!.isEmpty - ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followersobj!.data!.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followersobj!.data![index].follower! - .profilePhoto == - null || - followersobj!.data![index].follower! - .profilePhoto!.isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followersobj!.data![index] - .follower!.profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followersobj!.data![index].follower! - .fullName == - null || - followersobj! - .data![index] - .follower! - .fullName! - .isEmpty == - true - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC(followersobj! - .data![index] - .follower! - .fullName!), - sizedBoxHeight(4.h), - followersobj!.data![index].follower! - .userName == - null || - followersobj! - .data![index] - .follower! - .userName! - .isEmpty == - true - ? text12w400_FCFCFC_blur("regroup") - : text12w400_FCFCFC_blur(followersobj! - .data![index].follower!.userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async { - setState(() { - removeid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower!.id == - removeid); - RemoveUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Remove user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () async { - setState(() { - blockid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower!.id == - blockid); - BlockUploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Block user"), - Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), - ) - ], - ); - }, + sizedBoxHeight(20.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return Expanded( + child: Center(child: CircularProgressIndicator())); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18), + ), ); - } - }, - ), - ], - ); + } else { + // Data has been loaded, show actual UI + return followersobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: ScrollPhysics(), + shrinkWrap: true, + itemCount: followersobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followersobj!.data![index].follower! + .profilePhoto == + null || + followersobj! + .data![index] + .follower! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followersobj! + .data![index] + .follower! + .profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followersobj!.data![index].follower! + .fullName == + null || + followersobj! + .data![index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC( + followersobj!.data![index] + .follower!.fullName!), + sizedBoxHeight(4.h), + followersobj!.data![index].follower! + .userName == + null || + followersobj! + .data![index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followersobj!.data![index] + .follower!.userName!) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext + context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: () async { + setState(() { + removeid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower! + .id == + removeid); + RemoveUploadata(); + }); + }, + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Remove user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_delete-28-regular.png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-regular.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () async { + setState(() { + blockid = followersobj! + .data![index] + .follower! + .id ?? + 0; + followersobj!.data! + .removeWhere((item) => + item.follower! + .id == + blockid); + BlockUploadata(); + }); + }, + child: Padding( + padding: + EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Block user"), + Spacer(), + Image.asset( + "assets/images/png/blockchat.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ) + ], + ); + }, + ); + } + }, + ), + ], + ), + ]); } Widget _buildNoDataBody(context) { @@ -510,224 +532,230 @@ class _followingTabState extends State { @override Widget build(BuildContext context) { - return Column( + return ListView( + physics: ScrollPhysics(), + scrollDirection: Axis.vertical, children: [ - sizedBoxHeight(25.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", - height: 23, - width: 23, + Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: CustomTextFormField( + leadingIcon: SizedBox( + height: 23, + width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), ), ), + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // Onboard().postGroupsearch({"search": value}, + // streamController: searchcontroller); + // searchGroups(value!); + Profilegetmethod() + .getFollowing(value, streamController: searchcontroller); + }, ), - hintText: "Search people", - texttype: TextInputType.text, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - ], - onInput: (value) { - // Onboard().postGroupsearch({"search": value}, - // streamController: searchcontroller); - // searchGroups(value!); - Profilegetmethod() - .getFollowing(value, streamController: searchcontroller); + ), + sizedBoxHeight(20.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return Expanded( + child: Center(child: CircularProgressIndicator())); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return followingobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: ScrollPhysics(), + shrinkWrap: true, + itemCount: followingobj!.data!.length, + separatorBuilder: (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return + // Column( + // children: [ + // Followinglist( + // imagePath: followingobj?.data?[index] + // .following?.profilePhoto ?? + // '', + // title: followingobj! + // .data?[index].following?.fullName ?? + // '', + // subtitle: followingobj! + // .data?[index].following?.userName ?? + // '', + // unfollowontap: (id) => Uploadata(id), + // unfollowindex: followingobj! + // .data![index].following!.id!, + // ), + // if (index != followingobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followingobj!.data![index].following! + .profilePhoto == + null || + followingobj!.data![index].following! + .profilePhoto!.isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followingobj!.data![index] + .following!.profilePhoto!), + radius: 25.r, + ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followingobj!.data![index].following! + .fullName == + null || + followingobj!.data![index] + .following!.fullName!.isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC(followingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + followingobj!.data![index].following! + .userName == + null || + followingobj!.data![index] + .following!.userName!.isEmpty + ? text12w400_FCFCFC_blur("regroup") + : text12w400_FCFCFC_blur(followingobj! + .data![index] + .following! + .userName!) + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: + BoxConstraints.tightFor(width: 176.w), + offset: Offset(0, 20), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () async { + setState(() { + unfollowid = followingobj! + .data![index] + .following! + .id ?? + 0; + // followingobj!.data!.removeAt(index); + followingobj!.data! + .removeWhere((item) => + item.following!.id == + unfollowid); + Uploadata(); + }); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Unfollow user"), + Spacer(), + Image.asset( + "assets/images/png/Black1323e.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-22.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ), + ], + ); + }, + ); + } }, ), - ), - sizedBoxHeight(20.h), - StreamBuilder( - stream: searchcontroller.stream, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - // Display shimmer effect while waiting for data - return Expanded( - child: Center(child: CircularProgressIndicator())); - } else if (snapshot.hasError) { - // Handle error state - return Center( - child: Text( - '${snapshot.error} occurred', - style: TextStyle(fontSize: 18), - ), - ); - } else { - // Data has been loaded, show actual UI - return followingobj!.data!.isEmpty - ? _buildNoDataBody(context) - : ListView.separated( - physics: ScrollPhysics(), - shrinkWrap: true, - itemCount: followingobj!.data!.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return - // Column( - // children: [ - // Followinglist( - // imagePath: followingobj?.data?[index] - // .following?.profilePhoto ?? - // '', - // title: followingobj! - // .data?[index].following?.fullName ?? - // '', - // subtitle: followingobj! - // .data?[index].following?.userName ?? - // '', - // unfollowontap: (id) => Uploadata(id), - // unfollowindex: followingobj! - // .data![index].following!.id!, - // ), - // if (index != followingobj!.data!.length - 1) - // commonDivider(), - // ], - // ); - Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followingobj!.data![index].following! - .profilePhoto == - null || - followingobj!.data![index].following! - .profilePhoto!.isEmpty - ? CircleAvatar( - backgroundImage: AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followingobj!.data![index] - .following!.profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followingobj!.data![index].following! - .fullName == - null || - followingobj!.data![index] - .following!.fullName!.isEmpty - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC(followingobj! - .data![index] - .following! - .fullName!), - sizedBoxHeight(4.h), - followingobj!.data![index].following! - .userName == - null || - followingobj!.data![index] - .following!.userName!.isEmpty - ? text12w400_FCFCFC_blur("regroup") - : text12w400_FCFCFC_blur(followingobj! - .data![index] - .following! - .userName!) - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: - BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 20), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () async { - setState(() { - unfollowid = followingobj! - .data![index] - .following! - .id ?? - 0; - // followingobj!.data!.removeAt(index); - followingobj!.data! - .removeWhere((item) => - item.following!.id == - unfollowid); - Uploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Unfollow user"), - Spacer(), - Image.asset( - "assets/images/png/Black1323e.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-22.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), - ), - )), - ], - ), - ), - ], - ); - }, - ); - } - }, - ), - ], + ], + ), + ] ); } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSessions.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSessions.dart index 73c2ed1..347e96b 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSessions.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSessions.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; -import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; @@ -30,7 +30,65 @@ class _AccountSessionState extends State { appBar: CommonAppbar( titleTxt: "Account sessions", ), - body: Stack(children: [ + body: + FutureBuilder( + future: Profilegetmethod().getAccountSessions(), + builder: (ctx, snapshot) { + if (snapshot.data == null) { + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: CircularProgressIndicator( + color: Color(0xFFC18948), + ), + ) + ], + ); + } + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + return Center( + child: Text( + '${snapshot.error} occured', + style: TextStyle(fontSize: 18.spMin), + ), + ); + } + } + return accountsessionobj!.data!.isEmpty + ? _buildNoDataBody(context) + : _buildBody(context); + }, + ), + + + ); + } + + Widget _buildNoDataBody(context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], + ), + ); + } + + Widget _buildBody(context) { + return + + Stack(children: [ Container( decoration: const BoxDecoration( image: DecorationImage( @@ -45,17 +103,30 @@ class _AccountSessionState extends State { sizedBoxHeight(16.h), ListView.builder( shrinkWrap: true, - itemCount: sessionData.length, + physics: ScrollPhysics(), + itemCount: accountsessionobj!.data!.length, itemBuilder: (context, index) { - return sessionCard(title: sessionData[index]); + final city = accountsessionobj!.data![index].city; + final state = accountsessionobj!.data![index].state; + final country = accountsessionobj!.data![index].country; + + // Combine city, state, and country + final locationTitle = '$city, $state, $country'; + return sessionCard( + title: locationTitle, + devicename: accountsessionobj!.data![index].deviceName!, + ipaddress: accountsessionobj!.data![index].ipAddress! + + ); }, ) ]), ) - ])); - } + ]); + + } - Widget sessionCard({required String title}) { + Widget sessionCard({required String title, required String devicename, required String ipaddress}) { return Padding( padding: const EdgeInsets.symmetric(vertical: 15), child: commonGlassContainer( @@ -89,7 +160,7 @@ class _AccountSessionState extends State { sizedBoxHeight(16.h), Row( children: [ - text14400whiteblur("Apple iPhone 15"), + text14400whiteblur(devicename), sizedBoxWidth(6.w), Icon( Icons.circle, @@ -97,7 +168,7 @@ class _AccountSessionState extends State { color: Colors.white, ), sizedBoxWidth(6.w), - text144005DFD63("192.158.1.38") + text144005DFD63(ipaddress.toString()) ], ) ], diff --git a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart index 5ce669c..e54acb0 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart @@ -6,7 +6,6 @@ import 'package:get/get.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart' as timelineabilist; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart'; @@ -82,7 +81,7 @@ class _AddTimelineState extends State { // late Future myfuture; FutureGroup futureGroup = FutureGroup(); RxBool isloading = true.obs; - + List seelctedNameList = []; @override void initState() { // TODO: implement initState @@ -101,44 +100,40 @@ class _AddTimelineState extends State { edittimelineobj!.data!.timelineData!.startDate ?? ""; dateController2.text = edittimelineobj!.data!.timelineData!.endDate ?? ""; - String abilitiesXids = - edittimelineobj!.data!.timelineData!.abilitiesXids ?? ""; - abilitiesIds = abilitiesXids - .split(',') - .map((e) => int.tryParse(e.trim()) ?? 0) // Trim spaces around IDs - .toList(); - selectedabilityid = abilitiesIds; - print(selectedabilityid.toList()); - - for (int i = 0; i < _abilitydrop.length; i++) { - _abilityMap.add({ - "id": i + 1, - "name": _abilitydrop[i], - }); - } + log(_abilityMap.length.toString()); // futureGroup.add( fetchABilitylist().then((value) { - isloading = false.obs; + String abilitiesXids = + edittimelineobj!.data!.timelineData!.abilitiesXids ?? ""; + abilitiesIds = abilitiesXids + .split(',') + .map((e) => int.tryParse(e.trim()) ?? 0) // Trim spaces around IDs + .toList(); + selectedabilityid = abilitiesIds; + + print(selectedabilityid.toList()); + + for (int i = 0; i < _abilitydrop.length; i++) { + _abilityMap.add({ + "id": i + 1, + "name": _abilitydrop[i], + }); + } + getSelectedNames(selectedabilityid).then((value) { + seelctedNameList = value; + isloading = false.obs; + }); }); // ); }); - // ); - // myfuture = Profilegetmethod().getEditTimeline(id); + + } else { + fetchABilitylist().then((value) { + isloading = false.obs; + }); } - // futureGroup.add( - // ); - // futureGroup.close(); - fetchABilitylist().then((value) { - isloading = false.obs; - }); - - // WidgetsBinding.instance.addPostFrameCallback((_) { - // fetchABilitylist(); - // }); - - // setValues(); super.initState(); } @@ -160,13 +155,6 @@ class _AddTimelineState extends State { final data = await Profilepostmethod().postTimeline(updata); if (data.status == ResponseStatus.SUCCESS) { Get.back(); - // String? accountype; - - // accountype = prefs.getString('accountTypefromLogin'); - - // if (accountype == "1") { - // EditProfileApi().getEditProfileIndividual(); - // } Get.back(); print("timeline done"); return utils.showToast(data.message); @@ -207,7 +195,7 @@ class _AddTimelineState extends State { List listData = []; // Function to get names from selected IDs - List getSelectedNames(List selectedIds) { + Future> getSelectedNames(List selectedIds) async { List selectedNames = []; for (int id in selectedIds) { for (Map ability in _abilityMap) { @@ -219,6 +207,7 @@ class _AddTimelineState extends State { _abilitydrop = _abilityMap.map((ability) => ability["name"] as String).toList(); } + return selectedNames; } @@ -235,323 +224,6 @@ class _AddTimelineState extends State { titleTxt: "Add timeline", ), body: - // edited == true - // ? FutureBuilder( - // future: futureGroup.future, - // builder: (ctx, snapshot) { - // if (snapshot.data == null) { - // return Center( - // child: CircularProgressIndicator( - // color: Colors.blue, - // ), - // ); - // } - // if (snapshot.connectionState == ConnectionState.done) { - // if (snapshot.hasError) { - // return Center( - // child: Text( - // '${snapshot.error} occured', - // style: TextStyle(fontSize: 18.spMin), - // ), - // ); - // } else if (snapshot.hasData) { - // clubNameController.text = - // edittimelineobj!.data!.timelineData!.clubName ?? ""; - // rollnameController.text = - // edittimelineobj!.data!.timelineData!.roleName ?? ""; - // teamnameController.text = - // edittimelineobj!.data!.timelineData!.teamName ?? ""; - // ""; - // dateController.text = - // edittimelineobj!.data!.timelineData!.startDate ?? - // ""; - // dateController2.text = - // edittimelineobj!.data!.timelineData!.endDate ?? ""; - - // // String abilitiesXids = edittimelineobj! - // // .data!.timelineData!.abilitiesXids ?? - // // ""; - // // List abilitiesIds = abilitiesXids - // // .split(',') - // // .map((e) => int.tryParse(e) ?? 0) - // // .toList(); - // String abilitiesXids = edittimelineobj! - // .data!.timelineData!.abilitiesXids ?? - // ""; - // abilitiesIds = abilitiesXids - // .split(',') - // .map((e) => - // int.tryParse(e.trim()) ?? - // 0) // Trim spaces around IDs - // .toList(); - // selectedabilityid = abilitiesIds; - - // print(selectedabilityid.toList()); - - // for (int i = 0; i < _abilitydrop.length; i++) { - // _abilityMap.add({ - // "id": i + 1, - // "name": _abilitydrop[i], - // }); - // } - // } - // } - // return Stack(children: [ - // Container( - // decoration: const BoxDecoration( - // image: DecorationImage( - // image: AssetImage( - // "assets/images/png/Ellipse 1496.png"), - // fit: BoxFit.fill)), - // ), - // ListView(physics: ScrollPhysics(), children: [ - // Padding( - // padding: EdgeInsets.symmetric(horizontal: 16.w), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // sizedBoxHeight(20.h), - // text16400white("Club name"), - // sizedBoxHeight(15.h), - // CustomTextFormField( - // textEditingController: clubNameController, - // texttype: TextInputType.text, - // hintText: 'Enter club name', - // validator: (value) { - // if (value!.isEmpty) { - // return 'Enter your full name '; - // } - // return null; - // }, - // inputFormatters: [ - // // LengthLimitingTextInputFormatter(20), - // RemoveEmojiInputFormatter(), - // FilteringTextInputFormatter.allow( - // RegExp('[a-zA-Z ]')) - // ], - // ), - // sizedBoxHeight(25.h), - // text16400white("Role in the club"), - // sizedBoxHeight(15.h), - // CustomTextFormField( - // textEditingController: rollnameController, - // texttype: TextInputType.text, - // hintText: 'Enter club name', - // validator: (value) { - // if (value!.isEmpty) { - // return 'Enter your full name '; - // } - // return null; - // }, - // inputFormatters: [ - // // LengthLimitingTextInputFormatter(20), - // RemoveEmojiInputFormatter(), - // FilteringTextInputFormatter.allow( - // RegExp('[a-zA-Z ]')) - // ], - // ), - // sizedBoxHeight(25.h), - // text16400white("Team name"), - // sizedBoxHeight(15.h), - // CustomTextFormField( - // textEditingController: teamnameController, - // texttype: TextInputType.text, - // hintText: 'Enter club name', - // validator: (value) { - // if (value!.isEmpty) { - // return 'Enter your full name '; - // } - // return null; - // }, - // inputFormatters: [ - // // LengthLimitingTextInputFormatter(20), - // RemoveEmojiInputFormatter(), - // FilteringTextInputFormatter.allow( - // RegExp('[a-zA-ZS0-9 ]')), - // ], - // ), - // sizedBoxHeight(25.h), - // Row( - // mainAxisAlignment: - // MainAxisAlignment.spaceBetween, - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Expanded( - // child: Column( - // crossAxisAlignment: - // CrossAxisAlignment.start, - // children: [ - // text16400white("Start date "), - // sizedBoxHeight(10.h), - // GestureDetector( - // onTap: () => datePicker( - // context, dateController), - // child: AbsorbPointer( - // child: CustomTextFormField( - // textEditingController: - // dateController, - // leadingIcon: Container( - // height: 20.h, - // width: 20.w, - // child: Center( - // child: Image.asset( - // "assets/images/png/calender.png", - // height: 20.h, - // width: 20.w, - // ), - // ), - // ), - // ), - // ), - // ) - // ], - // ), - // ), - // sizedBoxWidth(10.h), - // Expanded( - // child: Column( - // crossAxisAlignment: - // CrossAxisAlignment.start, - // children: [ - // text16400white("End date"), - // sizedBoxHeight(10.h), - // GestureDetector( - // onTap: () => datePicker( - // context, dateController2), - // child: AbsorbPointer( - // child: CustomTextFormField( - // textEditingController: - // dateController2, - // leadingIcon: Container( - // height: 20.h, - // width: 20.w, - // child: Center( - // child: Image.asset( - // "assets/images/png/calender.png", - // height: 20.h, - // width: 20.w, - // ), - // ), - // ), - // ), - // ), - // ), - // sizedBoxHeight(10.h), - // Row( - // children: [ - // Obx(() { - // return commonGlassContainer( - // border: 1, - // borderradius: 2, - // height: 20.h, - // width: 20.w, - // opacity1: 0.24, - // opacity2: 0.24, - // customWidget: Transform.scale( - // scale: 1.2, - // child: Checkbox( - // side: BorderSide( - // color: Color( - // 0xFF434A53)), - // value: isChecked.value, - // activeColor: - // Colors.transparent, - // checkColor: Colors.white, - // onChanged: ((value) { - // // isChecked.value = value!; - // isChecked.value = - // value!; - // if (isChecked.value) { - // // Set end date to today's date - // dateController2 - // .text = DateFormat( - // 'yyyy-MM-dd') - // .format(DateTime - // .now()); - // } else { - // // Clear end date when checkbox is unchecked - // dateController2 - // .clear(); - // } - // }), - // ), - // ), - // ); - // }), - // sizedBoxWidth(8.w), - // text10400white("Present") - // ], - // ), - // ], - // ), - // ) - // ], - // ), - // text16400white("Ability"), - // sizedBoxHeight(15.h), - // // CustomDropDownCheckBoxTimeline( - // // header: 'Select ability', - // // title: '', - // // listData: _abilitydrop, - // // onItemSelected: getCatIdFromName, - // // initiallySelected: abilitiesIds - // // .map((id) => id.toString()) - // // .toList(), - // // ), - // CustomDropDownCheckBoxTimeline( - // header: 'Select ability', - // title: '', - // listData: listData, - // // _abilityMap.map((ability) => ability["name"]).toList(), - // onItemSelected: getCatIdFromName, - // // (selectedNames) { - // // // Convert selected names back to IDs if needed - // // List selectedIds = []; - // // for (String name in selectedNames) { - // // for (Map ability - // // in _abilityMap) { - // // if (ability["name"] == name) { - // // selectedIds.add(ability["id"]); - // // break; - // // } - // // } - // // } - // // // Use selectedIds as needed - // // print(selectedIds); - // // }, - // initiallySelected: getSelectedNames( - // abilitiesIds), // Pass initially selected names - // ), - // sizedBoxHeight(80.h), - // Padding( - // padding: - // EdgeInsets.symmetric(horizontal: 20.w), - // child: CustomButton( - // text: "Add timeline", - // onPressed: () { - // if (clubNameController.text.isBlank! || - // rollnameController.text.isBlank! || - // teamnameController.text.isBlank! || - // dateController.text.isBlank! || - // dateController2.text.isBlank! || - // selectedabilityid.isEmpty) { - // utils.showToast( - // 'Please fill all fields'); - // } else { - // print(selectedabilityid.toString()); - - // EdituploadData(); - // } - // }, - // ), - // ), - // ]), - // ) - // ]) - // ]); - // }, - // ) - // : Obx(() // { => @@ -819,8 +491,8 @@ class _AddTimelineState extends State { // // Use selectedIds as needed // print(selectedIds); // }, - initiallySelected: getSelectedNames( - abilitiesIds), // Pass initially selected names + initiallySelected: + seelctedNameList, // Pass initially selected names ), sizedBoxHeight(80.h), Padding( @@ -846,7 +518,7 @@ class _AddTimelineState extends State { print(selectedabilityid .toString()); - EdituploadData(); + // EdituploadData(); } }, ), @@ -1164,9 +836,155 @@ class _CustomDropDownCheckBoxTimelineState .addAll(widget.initiallySelected); // Initialize selectedValues } + // List> _buildDropdownMenuItems() { + // List> items = + // widget.listData.asMap().entries.map((entry) { + // int index = entry.key; + // String item = entry.value; + // return DropdownMenuItem( + // value: item, + // child: InkWell( + // onTap: () { + // setState(() { + // if (selectedValues.contains(item)) { + // selectedValues.remove(item); + // } else { + // selectedValues.add(item); + // } + // _textController.clear(); + // widget.onItemSelected( + // selectedValues.toList()); // Convert RxList to List + // }); + // }, + // child: Column( + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // Row( + // children: [ + // Obx(() { + // return Checkbox( + // value: selectedValues.contains(item), + // activeColor: Colors.white, + // checkColor: const Color(0xFFD90B2E), + // onChanged: (bool? value) { + // setState(() { + // if (value == true) { + // selectedValues.add(item); + // } else { + // selectedValues.remove(item); + // } + // _textController.clear(); + // widget.onItemSelected(selectedValues.toList()); + // }); + // }, + // ); + // }), + // const SizedBox(width: 8), + // Text( + // item, + // style: const TextStyle( + // color: Colors.white, + // fontSize: 16, + // fontFamily: 'Helvetica', + // fontWeight: FontWeight.w500, + // ), + // overflow: TextOverflow.ellipsis, + // ), + // ], + // ), + // if (index != widget.listData.length - 1) + // const Divider(thickness: 1, color: Color(0xFF434A53)), + // ], + // ), + // ), + // ); + // }).toList(); + + // if (widget.showOtherOption) { + // items.add( + // DropdownMenuItem( + // value: _textController.text, + // child: Column( + // children: [ + // const Divider(thickness: 1, color: Color(0xFF434A53)), + // Row( + // children: [ + // Obx(() { + // return Checkbox( + // value: selectedValues.contains(_textController.text), + // activeColor: Colors.white, + // onChanged: (bool? value) { + // setState(() { + // if (value == true && + // _textController.text.trim().isNotEmpty) { + // selectedValues.add(_textController.text); + // } else { + // selectedValues.remove(_textController.text); + // } + // widget.onItemSelected(selectedValues.toList()); + // }); + // }, + // ); + // }), + // const SizedBox(width: 8), + // const Text( + // "Other: ", + // style: TextStyle( + // color: Colors.white, + // fontSize: 16, + // fontFamily: 'Helvetica', + // fontWeight: FontWeight.w500, + // ), + // overflow: TextOverflow.ellipsis, + // ), + // Expanded( + // child: TextField( + // controller: _textController, + // style: const TextStyle( + // color: Colors.white, + // fontSize: 16, + // fontFamily: 'Helvetica', + // fontWeight: FontWeight.w500, + // ), + // decoration: const InputDecoration( + // hintText: '', + // hintStyle: TextStyle(color: Colors.white70), + // border: UnderlineInputBorder(), + // ), + // ), + // ), + // TextButton( + // onPressed: () { + // setState(() { + // if (_textController.text.trim().isNotEmpty) { + // selectedValues.add(_textController.text); + // widget.onItemSelected(selectedValues.toList()); + // } + // }); + // }, + // child: const Text( + // 'OK', + // style: TextStyle( + // color: Colors.white, + // fontSize: 16, + // fontFamily: 'Helvetica', + // fontWeight: FontWeight.w500, + // ), + // ), + // ), + // ], + // ), + // SizedBox(height: 10), + // ], + // ), + // ), + // ); + // } + // return items; + // } + List> _buildDropdownMenuItems() { - List> items = - widget.listData.asMap().entries.map((entry) { + return widget.listData.asMap().entries.map((entry) { int index = entry.key; String item = entry.value; return DropdownMenuItem( @@ -1180,8 +998,7 @@ class _CustomDropDownCheckBoxTimelineState selectedValues.add(item); } _textController.clear(); - widget.onItemSelected( - selectedValues.toList()); // Convert RxList to List + widget.onItemSelected(selectedValues.toList()); }); }, child: Column( @@ -1208,15 +1025,18 @@ class _CustomDropDownCheckBoxTimelineState ); }), const SizedBox(width: 8), - Text( - item, - style: const TextStyle( - color: Colors.white, - fontSize: 16, - fontFamily: 'Helvetica', - fontWeight: FontWeight.w500, + Expanded( + child: Text( + item, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w500, + ), + maxLines: 1, // Adjust as needed + overflow: TextOverflow.ellipsis, ), - overflow: TextOverflow.ellipsis, ), ], ), @@ -1227,88 +1047,6 @@ class _CustomDropDownCheckBoxTimelineState ), ); }).toList(); - - if (widget.showOtherOption) { - items.add( - DropdownMenuItem( - value: _textController.text, - child: Column( - children: [ - const Divider(thickness: 1, color: Color(0xFF434A53)), - Row( - children: [ - Obx(() { - return Checkbox( - value: selectedValues.contains(_textController.text), - activeColor: Colors.white, - onChanged: (bool? value) { - setState(() { - if (value == true && - _textController.text.trim().isNotEmpty) { - selectedValues.add(_textController.text); - } else { - selectedValues.remove(_textController.text); - } - widget.onItemSelected(selectedValues.toList()); - }); - }, - ); - }), - const SizedBox(width: 8), - const Text( - "Other: ", - style: TextStyle( - color: Colors.white, - fontSize: 16, - fontFamily: 'Helvetica', - fontWeight: FontWeight.w500, - ), - overflow: TextOverflow.ellipsis, - ), - Expanded( - child: TextField( - controller: _textController, - style: const TextStyle( - color: Colors.white, - fontSize: 16, - fontFamily: 'Helvetica', - fontWeight: FontWeight.w500, - ), - decoration: const InputDecoration( - hintText: '', - hintStyle: TextStyle(color: Colors.white70), - border: UnderlineInputBorder(), - ), - ), - ), - TextButton( - onPressed: () { - setState(() { - if (_textController.text.trim().isNotEmpty) { - selectedValues.add(_textController.text); - widget.onItemSelected(selectedValues.toList()); - } - }); - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.white, - fontSize: 16, - fontFamily: 'Helvetica', - fontWeight: FontWeight.w500, - ), - ), - ), - ], - ), - SizedBox(height: 10), - ], - ), - ), - ); - } - return items; } @override @@ -1355,15 +1093,19 @@ class _CustomDropDownCheckBoxTimelineState ? SizedBox() : widget.leadingImage!, const SizedBox(width: 12), - Text( - selectedValues.isEmpty - ? widget.header - : selectedValues.join(', '), - style: TextStyle( + Expanded( + child: Text( + selectedValues.isEmpty + ? widget.header + : selectedValues.join(', '), + style: TextStyle( color: Colors.white, fontSize: 16, fontFamily: 'Helvetica', - fontWeight: FontWeight.w400), + fontWeight: FontWeight.w400, + ), + overflow: TextOverflow.ellipsis, + ), ), const Spacer(), onDropTap.value diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart index 58f48e3..e60ef28 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart @@ -4,6 +4,7 @@ import 'dart:developer'; import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/faqModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followersModel.dart'; @@ -18,6 +19,7 @@ TermsConditionsModel? termsobj; FollowersModel? followersobj; FollowingModel? followingobj; GetEditTimelineModel? edittimelineobj; +GetAccountSessionsModel? accountsessionobj; class Profilegetmethod { @@ -93,4 +95,16 @@ class Profilegetmethod { } return response; } + + Future> getAccountSessions() async { + final response = await NetworkApiServices().getApi( + ApiUrls.getaccountsessions, + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + accountsessionobj = GetAccountSessionsModel.fromJson(response.data); + log(accountsessionobj!.data.toString()); + } + return response; + } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart index 526fe47..2e3e64d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart @@ -217,5 +217,27 @@ class Profilepostmethod { print("response message is ${response.message}"); return response; } + + Future> postRemoveCertification(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postremovecertification, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } + + Future> postCertification(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postcertification, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } } diff --git a/lib/Utils/Common/CommonDropdown.dart b/lib/Utils/Common/CommonDropdown.dart index c902f45..bea237a 100644 --- a/lib/Utils/Common/CommonDropdown.dart +++ b/lib/Utils/Common/CommonDropdown.dart @@ -74,12 +74,9 @@ class _CustomDropDownWidgetSignupState // 'assets/images/png/user.png', // ), - widget.leadingImage == null - ? - SizedBox() - : - widget.leadingImage! - , + widget.leadingImage == null + ? SizedBox() + : widget.leadingImage!, SizedBox(width: 16.w), Text( @@ -933,15 +930,76 @@ class _CustomDropDownChexkBoxState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ + // GestureDetector( + // onTap: () { + // onDropTap.value = !onDropTap.value; + // }, + // child: Container( + // width: double.infinity, + // // height: 50, + // padding: + // EdgeInsets.only(right: 22, left: 12, top: 14, bottom: 14), + // decoration: BoxDecoration( + // color: const Color(0xFFFFFFFF).withOpacity(0.10), + // borderRadius: onDropTap.value + // ? const BorderRadius.vertical( + // top: Radius.circular(30), + // ) + // : const BorderRadius.all(Radius.circular(30)), + // gradient: LinearGradient( + // begin: Alignment.topLeft, + // end: Alignment.bottomRight, + // colors: [ + // const Color(0xFFffffff).withOpacity(0.50), + // const Color(0xFFFFFFFF).withOpacity(0.50), + // ], + // ), + // border: Border.all(color: const Color(0xFF434A53)), + // ), + // child: Center( + // child: Row( + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.center, + // children: [ + // // if (widget.leadingImage != null) widget.leadingImage!, + // widget.leadingImage == null + // ? + // SizedBox() + // : + // widget.leadingImage!, + // const SizedBox(width: 12), + // Expanded( + // child: Text( + // selectedValues.isEmpty + // ? widget.header + // : selectedValues.join(', '), + // style: TextStyle( + // color: Colors.white, + // fontSize: 16, + // fontFamily: 'Helvetica', + // fontWeight: FontWeight.w400), + // ), + // ), + // const Spacer(), + // onDropTap.value + // ? Image.asset('assets/images/png/arrowup.png') + // : Image.asset('assets/images/png/arrowdown.png'), + // ], + // ), + // ), + // ), + // ), GestureDetector( onTap: () { onDropTap.value = !onDropTap.value; }, child: Container( width: double.infinity, - // height: 50, - padding: - EdgeInsets.only(right: 22, left: 12, top: 14, bottom: 14), + height: 50, + padding: EdgeInsets.only( + right: 22, + left: 12, + ), decoration: BoxDecoration( color: const Color(0xFFFFFFFF).withOpacity(0.10), borderRadius: onDropTap.value @@ -964,12 +1022,9 @@ class _CustomDropDownChexkBoxState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - // if (widget.leadingImage != null) widget.leadingImage!, - widget.leadingImage == null - ? - SizedBox() - : - widget.leadingImage!, + widget.leadingImage == null + ? SizedBox() + : widget.leadingImage!, const SizedBox(width: 12), Expanded( child: Text( @@ -977,10 +1032,12 @@ class _CustomDropDownChexkBoxState extends State { ? widget.header : selectedValues.join(', '), style: TextStyle( - color: Colors.white, - fontSize: 16, - fontFamily: 'Helvetica', - fontWeight: FontWeight.w400), + color: Colors.white, + fontSize: 16, + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400, + ), + overflow: TextOverflow.ellipsis, ), ), const Spacer(), diff --git a/lib/main.dart b/lib/main.dart index 59cf7bc..d1aa8d7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -182,7 +182,7 @@ class _MyAppState extends State with WidgetsBindingObserver { fontFamily: 'Cambria', ), debugShowCheckedModeBanner: false, - initialRoute: RouteName.profiletabbusguest, + initialRoute: RouteName.splashScreen, getPages: AppRoutes.appRoutes(), ), designSize: const Size(390, 844), diff --git a/lib/onboarding/Signup/view_model/postmethod.dart b/lib/onboarding/Signup/view_model/postmethod.dart index e4396d9..ff9a2c8 100644 --- a/lib/onboarding/Signup/view_model/postmethod.dart +++ b/lib/onboarding/Signup/view_model/postmethod.dart @@ -124,4 +124,15 @@ class Onboard { print("response message is ${response.message}"); return response; } + + Future> postUserdevice(updata) async { + print("updata is $updata"); + final response = await NetworkApiServices().postApi( + updata, + ApiUrls.postuserdevice, + ); + print("response is ${response.data}"); + print("response message is ${response.message}"); + return response; + } } diff --git a/lib/onboarding/SplashScreen.dart b/lib/onboarding/SplashScreen.dart index 99c4a71..ea8aab3 100644 --- a/lib/onboarding/SplashScreen.dart +++ b/lib/onboarding/SplashScreen.dart @@ -1,15 +1,20 @@ import 'dart:async'; import 'dart:developer'; +import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; +import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Global.dart'; import 'package:regroup/Utils/Common/NoInternet.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/onboarding/Signup/view_model/getUserprofile.dart'; +import 'package:regroup/onboarding/Signup/view_model/postmethod.dart'; import 'package:regroup/resources/routes/route_name.dart'; import 'package:shared_preferences/shared_preferences.dart'; // import 'package:shared_preferences/shared_preferences.dart'; @@ -26,7 +31,37 @@ class _SplashScreenState extends State { void initState() { super.initState(); - Future.delayed(const Duration(seconds: 2), () async { + // Future.delayed(const Duration(seconds: 2), () async { + // SharedPreferences prefs = await SharedPreferences.getInstance(); + // token = prefs.getString('access-token'); + // emailid = prefs.getString('email'); + // myusername = prefs.getString('username'); + // fullname = prefs.getString('fullname'); + // phonenumber = prefs.getString('phone'); + + // if (token == null || token!.isEmpty) { + // Get.toNamed(RouteName.onboarding1); + // } else { + // await Getuserdetails().Getuser().then((value) { + // if (getuserobj?.data?.userData?.isProfileUpdated == 0) { + // String? accountype = + // getuserobj?.data?.userData?.principalTypeXid.toString(); + + // if (accountype == "1") { + // Get.toNamed(RouteName.tellusindividualscreen, + // arguments: {'pageroute': "mainscreen"}); + // } else if (accountype == "2") { + // Get.toNamed(RouteName.tellusbusinessscreen, + // arguments: {'pageroute': "mainscreen"}); + // } + // } else { + // Get.toNamed(RouteName.mainscreen); + // } + // }); + // } + // }); + + Future.delayed(const Duration(seconds: 2), () async { SharedPreferences prefs = await SharedPreferences.getInstance(); token = prefs.getString('access-token'); emailid = prefs.getString('email'); @@ -34,9 +69,14 @@ class _SplashScreenState extends State { fullname = prefs.getString('fullname'); phonenumber = prefs.getString('phone'); + String deviceName = await getDeviceName(); + print('Device Name: $deviceName'); + + if (token == null || token!.isEmpty) { Get.toNamed(RouteName.onboarding1); } else { + await Uploadata(deviceName); await Getuserdetails().Getuser().then((value) { if (getuserobj?.data?.userData?.isProfileUpdated == 0) { String? accountype = @@ -57,6 +97,37 @@ class _SplashScreenState extends State { }); } + Future getDeviceName() async { + final deviceInfo = DeviceInfoPlugin(); + String deviceName = ''; + + if (Platform.isAndroid) { + final androidInfo = await deviceInfo.androidInfo; + deviceName = androidInfo.model; + } else if (Platform.isIOS) { + final iosInfo = await deviceInfo.iosInfo; + deviceName = iosInfo.model; + } else { + deviceName = 'Unknown Device'; + } + + return deviceName; +} + +Uploadata(String devicename) async { + Map updata = { + "device_name": devicename, + }; + final data = await Onboard().postUserdevice(updata); + if (data.status == ResponseStatus.SUCCESS) { + + return utils.showToast(data.message); + } else { + print("device details not done"); + return utils.showToast(data.message); + } + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index 7a6dd1d..49dfdfd 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -131,4 +131,7 @@ class RouteName { static const String profiletabbusguest = '/profiletabbusguest'; + static const String addcertificate = '/addusercertificate'; + + } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index b0e2143..12a47a7 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -32,6 +32,7 @@ import 'package:regroup/Feed%20Module/Main_Screens/GroupTab/View/SubGroup/SubGro import 'package:regroup/Feed%20Module/Main_Screens/GroupTab/View/SubGroup/SubgroupSetting.dart'; import 'package:regroup/Feed%20Module/Main_Screens/GroupTab/View/SubGroup/Subgroups.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Badges/Badges.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Certificate/Certificate.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Clubs/Clubs.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart'; @@ -523,5 +524,11 @@ class AppRoutes { name: RouteName.mynetwork, page: () => MyNetwork(), ), + GetPage( + name: RouteName.addcertificate, + page: () => AddCertificate(), + ), + + ]; } -- 2.34.1 From fc0a71d3c1de9b0ba1df8de6c3f47518ea35a9e4 Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Tue, 23 Jul 2024 20:25:32 +0530 Subject: [PATCH 07/21] conlficts resolvesd for guest user --- .../EditProfile/Model/GetEditProfileIndi.dart | 128 ++- .../EditProfile/View/ProfileTab.dart | 34 +- .../Model/GuestGetProfileDataIndi.dart | 24 +- .../View/Individual/ProfileTabIndGuest.dart | 78 +- .../ProfileTab/My Network/MyNetwork.dart | 866 ++++++++++-------- lib/Utils/Common/ShimmerCommon.dart | 14 +- 6 files changed, 611 insertions(+), 533 deletions(-) diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart index 339e49d..ebe4ad3 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart @@ -43,7 +43,7 @@ class Data { Follows? follows; List? timelines; int? accountVisibility; - List? myJoinedSubgroups; + List? myJoinedGroups; List? certifications; int? daysBeforeJoined; @@ -66,7 +66,7 @@ class Data { this.follows, this.timelines, this.accountVisibility, - this.myJoinedSubgroups, + this.myJoinedGroups, this.certifications, this.daysBeforeJoined }); @@ -100,10 +100,10 @@ class Data { }); } accountVisibility = json['account_visibility']; - if (json['my_joined_subgroups'] != null) { - myJoinedSubgroups = []; - json['my_joined_subgroups'].forEach((v) { - myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); + if (json['my_joined_groups'] != null) { + myJoinedGroups = []; + json['my_joined_groups'].forEach((v) { + myJoinedGroups!.add(new MyJoinedGroups.fromJson(v)); }); } if (json['certifications'] != null) { @@ -140,9 +140,9 @@ class Data { data['timelines'] = this.timelines!.map((v) => v.toJson()).toList(); } data['account_visibility'] = this.accountVisibility; - if (this.myJoinedSubgroups != null) { - data['my_joined_subgroups'] = - this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); + if (this.myJoinedGroups != null) { + data['my_joined_groups'] = + this.myJoinedGroups!.map((v) => v.toJson()).toList(); } if (this.certifications != null) { data['certifications'] = @@ -262,64 +262,6 @@ class Follows { } } -class MyJoinedSubgroups { - int? id; - int? iamPrincipalXid; - int? manageGroupXid; - int? manageSubGroupXid; - SubGroupData? subGroupData; - - MyJoinedSubgroups( - {this.id, - this.iamPrincipalXid, - this.manageGroupXid, - this.manageSubGroupXid, - this.subGroupData}); - - MyJoinedSubgroups.fromJson(Map json) { - id = json['id']; - iamPrincipalXid = json['iam_principal_xid']; - manageGroupXid = json['manage_group_xid']; - manageSubGroupXid = json['manage_sub_group_xid']; - subGroupData = json['sub_group_data'] != null - ? new SubGroupData.fromJson(json['sub_group_data']) - : null; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['iam_principal_xid'] = this.iamPrincipalXid; - data['manage_group_xid'] = this.manageGroupXid; - data['manage_sub_group_xid'] = this.manageSubGroupXid; - if (this.subGroupData != null) { - data['sub_group_data'] = this.subGroupData!.toJson(); - } - return data; - } -} - -class SubGroupData { - int? id; - String? title; - String? subGroupImage; - - SubGroupData({this.id, this.title, this.subGroupImage}); - - SubGroupData.fromJson(Map json) { - id = json['id']; - title = json['title']; - subGroupImage = json['sub_group_image']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['title'] = this.title; - data['sub_group_image'] = this.subGroupImage; - return data; - } -} class Certifications { int? id; @@ -357,3 +299,55 @@ class Certifications { return data; } } + +class MyJoinedGroups { + int? id; + int? iamPrincipalXid; + int? manageGroupXid; + GroupData? groupData; + + MyJoinedGroups( + {this.id, this.iamPrincipalXid, this.manageGroupXid, this.groupData}); + + MyJoinedGroups.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + manageGroupXid = json['manage_group_xid']; + groupData = json['group_data'] != null + ? new GroupData.fromJson(json['group_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['iam_principal_xid'] = this.iamPrincipalXid; + data['manage_group_xid'] = this.manageGroupXid; + if (this.groupData != null) { + data['group_data'] = this.groupData!.toJson(); + } + return data; + } +} + +class GroupData { + int? id; + String? title; + String? groupImage; + + GroupData({this.id, this.title, this.groupImage}); + + GroupData.fromJson(Map json) { + id = json['id']; + title = json['title']; + groupImage = json['group_image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['group_image'] = this.groupImage; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index a0d16c9..e3c1880 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -584,6 +584,8 @@ class _ProfileTabState extends State { ], ), Row( + mainAxisAlignment: + MainAxisAlignment.center, children: [ InkWell( onTap: @@ -625,13 +627,16 @@ class _ProfileTabState extends State { }); }, child: - SizedBox( - width: 20.w, - height: 20.h, - child: Image.asset( - "assets/images/png/iconamoon_edit-thin.png", - height: 14.h, - width: 14.w, + Padding( + padding: EdgeInsets.only(top: 4.h), + child: SizedBox( + width: 20.w, + height: 20.h, + child: Image.asset( + "assets/images/png/iconamoon_edit-thin.png", + height: 20.h, + width: 20.w, + ), ), ), ) @@ -974,7 +979,7 @@ class _ProfileTabState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - text18w700white("Subgroups"), + text18w700white("Groups"), ], ), ), @@ -987,22 +992,22 @@ class _ProfileTabState extends State { scrollDirection: Axis.horizontal, padding: EdgeInsets.only(left: 16.w), itemCount: getEditProfileIndi! - .data!.myJoinedSubgroups!.length, + .data!.myJoinedGroups!.length, itemBuilder: (context, index) { return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( imagePath: getEditProfileIndi! .data! - .myJoinedSubgroups![index] - .subGroupData! - .subGroupImage ?? + .myJoinedGroups![index] + .groupData! + .groupImage ?? '', // cardtile[index]["imagePath"], title: getEditProfileIndi! .data! - .myJoinedSubgroups![index] - .subGroupData! + .myJoinedGroups![index] + .groupData! .title! // cardtile[index]["title"] @@ -1074,7 +1079,6 @@ class _ProfileTabState extends State { builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return ShimmerCommon(); - } if (snapshot.hasError) { diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart index 28227ab..97a9af1 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart @@ -44,7 +44,7 @@ class Data { List? timelines; int? accountVisibility; List? myJoinedGroups; - List? myJoinedSubgroups; + // List? myJoinedSubgroups; List? certifications; int? daysBeforeJoined; @@ -66,7 +66,7 @@ class Data { this.timelines, this.accountVisibility, this.myJoinedGroups, - this.myJoinedSubgroups, + // this.myJoinedSubgroups, this.certifications, this.daysBeforeJoined}); @@ -104,12 +104,12 @@ class Data { myJoinedGroups!.add(new MyJoinedGroups.fromJson(v)); }); } - if (json['my_joined_subgroups'] != null) { - myJoinedSubgroups = []; - json['my_joined_subgroups'].forEach((v) { - myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); - }); - } + // if (json['my_joined_subgroups'] != null) { + // myJoinedSubgroups = []; + // json['my_joined_subgroups'].forEach((v) { + // myJoinedSubgroups!.add(new MyJoinedSubgroups.fromJson(v)); + // }); + // } if (json['certifications'] != null) { certifications = []; json['certifications'].forEach((v) { @@ -147,10 +147,10 @@ class Data { data['my_joined_groups'] = this.myJoinedGroups!.map((v) => v.toJson()).toList(); } - if (this.myJoinedSubgroups != null) { - data['my_joined_subgroups'] = - this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); - } + // if (this.myJoinedSubgroups != null) { + // data['my_joined_subgroups'] = + // this.myJoinedSubgroups!.map((v) => v.toJson()).toList(); + // } if (this.certifications != null) { data['certifications'] = this.certifications!.map((v) => v.toJson()).toList(); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart index a44a330..48aa32d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -275,37 +275,37 @@ class _ProfileTabIndGuestState extends State { ], ), ), - sizedBoxWidth(20.w), - Container( - height: 58.h, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.white, - width: 1.0, - ), - boxShadow: const [ - BoxShadow( - color: Color(0x66000000), - offset: Offset(0, 4), - blurRadius: 4.0, - ), - ], - ), - ), - sizedBoxWidth(20.w), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.clubs); - }, - child: Column( - children: [ - text16400white("10"), - sizedBoxHeight(6.h), - text12400whiteblur("Clubs") - ], - ), - ), + // sizedBoxWidth(20.w), + // Container( + // height: 58.h, + // decoration: BoxDecoration( + // color: Colors.white, + // border: Border.all( + // color: Colors.white, + // width: 1.0, + // ), + // boxShadow: const [ + // BoxShadow( + // color: Color(0x66000000), + // offset: Offset(0, 4), + // blurRadius: 4.0, + // ), + // ], + // ), + // ), + // sizedBoxWidth(20.w), + // GestureDetector( + // onTap: () { + // Get.toNamed(RouteName.clubs); + // }, + // child: Column( + // children: [ + // text16400white("10"), + // sizedBoxHeight(6.h), + // text12400whiteblur("Clubs") + // ], + // ), + // ), ], ), sizedBoxHeight(20.h), @@ -601,16 +601,16 @@ class _ProfileTabIndGuestState extends State { ), ), sizedBoxHeight(30.h), - text18w400white("Subgroups"), + text18w400white("Groups"), ]), ), sizedBoxHeight(20.h), - guestGetProfileInd!.data!.myJoinedSubgroups!.isEmpty + guestGetProfileInd!.data!.myJoinedGroups!.isEmpty ? Padding( padding: EdgeInsets.symmetric(vertical: 30.h), child: Center( child: text18w700white( - "No Subgroups Found")), + "No groups Found")), ) : SizedBox( height: 190.h, @@ -619,17 +619,17 @@ class _ProfileTabIndGuestState extends State { scrollDirection: Axis.horizontal, padding: EdgeInsets.only(left: 16.w), itemCount: guestGetProfileInd! - .data!.myJoinedSubgroups!.length, + .data!.myJoinedGroups!.length, itemBuilder: (context, index) { var subGroupData = guestGetProfileInd! .data! - .myJoinedSubgroups![index] - .subGroupData!; + .myJoinedGroups![index] + .groupData!; return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( imagePath: subGroupData - .subGroupImage ?? + .groupImage ?? cardtile[index]["imagePath"], title: subGroupData.title ?? cardtile[index]["title"]), @@ -1307,7 +1307,7 @@ class _ProfileTabIndGuestState extends State { Widget profilecardtile({required String imagePath, required String title}) { return Column( children: [ - guestGetProfileInd!.data!.myJoinedSubgroups!.isNotEmpty + guestGetProfileInd!.data!.myJoinedGroups!.isNotEmpty ? Container( width: 100.w, height: 109.h, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart index 71f7829..923be90 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart @@ -32,7 +32,7 @@ class _MyNetworkState extends State { @override Widget build(BuildContext context) { return GestureDetector( - onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), child: Scaffold( // key: _scaffoldKey1, resizeToAvoidBottomInset: false, @@ -238,188 +238,221 @@ class _FollowersTabState extends State { return commonDivider(); }, itemBuilder: (context, index) { - return Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( - children: [ - followersobj!.data![index].follower! - .profilePhoto == - null || - followersobj! - .data![index] - .follower! - .profilePhoto! - .isEmpty - ? CircleAvatar( - backgroundImage: const AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followersobj! - .data![index] - .follower! - .profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followersobj!.data![index].follower! - .fullName == - null || - followersobj! - .data![index] - .follower! - .fullName! - .isEmpty == - true - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC( - followersobj!.data![index] - .follower!.fullName!), - sizedBoxHeight(4.h), - followersobj!.data![index].follower! - .userName == - null || - followersobj! - .data![index] - .follower! - .userName! - .isEmpty == - true - ? text12w400_FCFCFC_blur( - "regroup") - : text12w400_FCFCFC_blur( - followersobj!.data![index] - .follower!.userName!) - ], - ), - const Spacer(), - PopupMenuButton( - surfaceTintColor: const Color(0xFF222935), - constraints: - BoxConstraints.tightFor( - width: 176.w), - offset: const Offset(0, 20), - color: const Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext - context) => - [ - PopupMenuItem( - // onTap: () {}, - onTap: () async { - setState(() { - removeid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower! - .id == - removeid); - RemoveUploadata(); - }); - }, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Remove user"), - const Spacer(), - Image.asset( - "assets/images/png/fluent_delete-28-regular.png", - height: 15.h, - width: 15.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - const Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-regular.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () async { - setState(() { - blockid = followersobj! - .data![index] - .follower! - .id ?? - 0; - followersobj!.data! - .removeWhere((item) => - item.follower! - .id == - blockid); - BlockUploadata(); - }); - }, - child: Padding( - padding: - EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Block user"), - const Spacer(), - Image.asset( - "assets/images/png/blockchat.png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, + return GestureDetector( + onTap: () { + followersobj!.data![index].follower! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName.profiletabindguest, + arguments: { + "FolloweridIndex": followersobj! + .data![index] + .iamPrincipalXid!, + }) + : Get.toNamed( + RouteName.profiletabbusguest, + arguments: { + "FolloweridIndex": followersobj! + .data![index] + .iamPrincipalXid!, + }); + }, + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followersobj!.data![index].follower! + .profilePhoto == + null || + followersobj! + .data![index] + .follower! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followersobj! + .data![index] + .follower! + .profilePhoto!), + radius: 25.r, ), - ), - )), - ], - ), - ) - ], + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followersobj! + .data![index] + .follower! + .fullName == + null || + followersobj! + .data![index] + .follower! + .fullName! + .isEmpty == + true + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC( + followersobj!.data![index] + .follower!.fullName!), + sizedBoxHeight(4.h), + followersobj! + .data![index] + .follower! + .userName == + null || + followersobj! + .data![index] + .follower! + .userName! + .isEmpty == + true + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followersobj!.data![index] + .follower!.userName!) + ], + ), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: const Offset(0, 20), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext context) => + [ + PopupMenuItem( + // onTap: () {}, + onTap: () async { + setState(() { + removeid = followersobj! + .data![ + index] + .follower! + .id ?? + 0; + followersobj! + .data! + .removeWhere((item) => + item.follower! + .id == + removeid); + RemoveUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Remove user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_delete-28-regular.png", + height: 15.h, + width: 15.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-regular.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () async { + setState(() { + blockid = followersobj! + .data![ + index] + .follower! + .id ?? + 0; + followersobj! + .data! + .removeWhere((item) => + item.follower! + .id == + blockid); + BlockUploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Block user"), + const Spacer(), + Image.asset( + "assets/images/png/blockchat.png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ) + ], + ), ); }, ); @@ -537,231 +570,278 @@ class _FollowingTabState extends State { @override Widget build(BuildContext context) { return ListView( - physics: const ScrollPhysics(), - scrollDirection: Axis.vertical, - children: [ - Column( + physics: const ScrollPhysics(), + scrollDirection: Axis.vertical, children: [ - sizedBoxHeight(25.h), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: CustomTextFormField( - leadingIcon: SizedBox( - height: 23, - width: 23, - child: Center( - child: Image.asset( - "assets/images/png/ion_search-outline.png", + Column( + children: [ + sizedBoxHeight(25.h), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: CustomTextFormField( + leadingIcon: SizedBox( height: 23, width: 23, + child: Center( + child: Image.asset( + "assets/images/png/ion_search-outline.png", + height: 23, + width: 23, + ), + ), ), + hintText: "Search people", + texttype: TextInputType.text, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + ], + onInput: (value) { + // Onboard().postGroupsearch({"search": value}, + // streamController: searchcontroller); + // searchGroups(value!); + Profilegetmethod().getFollowing(value, + streamController: searchcontroller); + return null; + }, ), ), - hintText: "Search people", - texttype: TextInputType.text, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - ], - onInput: (value) { - // Onboard().postGroupsearch({"search": value}, - // streamController: searchcontroller); - // searchGroups(value!); - Profilegetmethod() - .getFollowing(value, streamController: searchcontroller); - return null; - }, - ), - ), - sizedBoxHeight(20.h), - StreamBuilder( - stream: searchcontroller.stream, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - // Display shimmer effect while waiting for data - return const Expanded( - child: Center(child: CircularProgressIndicator())); - } else if (snapshot.hasError) { - // Handle error state - return Center( - child: Text( - '${snapshot.error} occurred', - style: const TextStyle(fontSize: 18), - ), - ); - } else { - // Data has been loaded, show actual UI - return followingobj!.data!.isEmpty - ? _buildNoDataBody(context) - : ListView.separated( - physics: const ScrollPhysics(), - shrinkWrap: true, - itemCount: followingobj!.data!.length, - separatorBuilder: (BuildContext context, int index) { - return commonDivider(); - }, - itemBuilder: (context, index) { - return - // Column( - // children: [ - // Followinglist( - // imagePath: followingobj?.data?[index] - // .following?.profilePhoto ?? - // '', - // title: followingobj! - // .data?[index].following?.fullName ?? - // '', - // subtitle: followingobj! - // .data?[index].following?.userName ?? - // '', - // unfollowontap: (id) => Uploadata(id), - // unfollowindex: followingobj! - // .data![index].following!.id!, - // ), - // if (index != followingobj!.data!.length - 1) - // commonDivider(), - // ], - // ); - Column( - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: 16.h, horizontal: 16.w), - child: Row( + sizedBoxHeight(20.h), + StreamBuilder( + stream: searchcontroller.stream, + builder: (ctx, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + // Display shimmer effect while waiting for data + return const Expanded( + child: Center(child: CircularProgressIndicator())); + } else if (snapshot.hasError) { + // Handle error state + return Center( + child: Text( + '${snapshot.error} occurred', + style: const TextStyle(fontSize: 18), + ), + ); + } else { + // Data has been loaded, show actual UI + return followingobj!.data!.isEmpty + ? _buildNoDataBody(context) + : ListView.separated( + physics: const ScrollPhysics(), + shrinkWrap: true, + itemCount: followingobj!.data!.length, + separatorBuilder: + (BuildContext context, int index) { + return commonDivider(); + }, + itemBuilder: (context, index) { + return + // Column( + // children: [ + // Followinglist( + // imagePath: followingobj?.data?[index] + // .following?.profilePhoto ?? + // '', + // title: followingobj! + // .data?[index].following?.fullName ?? + // '', + // subtitle: followingobj! + // .data?[index].following?.userName ?? + // '', + // unfollowontap: (id) => Uploadata(id), + // unfollowindex: followingobj! + // .data![index].following!.id!, + // ), + // if (index != followingobj!.data!.length - 1) + // commonDivider(), + // ], + // ); + GestureDetector( + onTap: () { + followingobj!.data![index].following! + .principleTypeXid == + 1 + ? Get.toNamed( + RouteName.profiletabindguest, + arguments: { + "FollowingidIndex": followingobj! + .data![index] + .followingIamPrincipalXid!, + }) + : Get.toNamed( + RouteName.profiletabbusguest, + arguments: { + "FollowingidIndex": followingobj! + .data![index] + .followingIamPrincipalXid!, + }); + }, + child: Column( children: [ - followingobj!.data![index].following! - .profilePhoto == - null || - followingobj!.data![index].following! - .profilePhoto!.isEmpty - ? CircleAvatar( - backgroundImage: const AssetImage( - 'assets/images/png/Ellipse 43.png'), - radius: 25.r, - ) - : CircleAvatar( - backgroundImage: NetworkImage( - followingobj!.data![index] - .following!.profilePhoto!), - radius: 25.r, - ), - sizedBoxWidth(10.w), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - followingobj!.data![index].following! - .fullName == - null || - followingobj!.data![index] - .following!.fullName!.isEmpty - ? text16w400_FCFCFC("Regroup") - : text16w400_FCFCFC(followingobj! - .data![index] - .following! - .fullName!), - sizedBoxHeight(4.h), - followingobj!.data![index].following! - .userName == - null || - followingobj!.data![index] - .following!.userName!.isEmpty - ? text12w400_FCFCFC_blur("regroup") - : text12w400_FCFCFC_blur(followingobj! - .data![index] - .following! - .userName!) - ], - ), - const Spacer(), - PopupMenuButton( - surfaceTintColor: const Color(0xFF222935), - constraints: - BoxConstraints.tightFor(width: 176.w), - offset: const Offset(0, 20), - color: const Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () async { - setState(() { - unfollowid = followingobj! - .data![index] - .following! - .id ?? - 0; - // followingobj!.data!.removeAt(index); - followingobj!.data! - .removeWhere((item) => - item.following!.id == - unfollowid); - Uploadata(); - }); - }, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Unfollow user"), - const Spacer(), - Image.asset( - "assets/images/png/Black1323e.png", - height: 20.h, - width: 20.w, - ) - ], - ), + Padding( + padding: EdgeInsets.symmetric( + vertical: 16.h, horizontal: 16.w), + child: Row( + children: [ + followingobj!.data![index].following! + .profilePhoto == + null || + followingobj! + .data![index] + .following! + .profilePhoto! + .isEmpty + ? CircleAvatar( + backgroundImage: const AssetImage( + 'assets/images/png/Ellipse 43.png'), + radius: 25.r, + ) + : CircleAvatar( + backgroundImage: NetworkImage( + followingobj! + .data![index] + .following! + .profilePhoto!), + radius: 25.r, ), - ), - const PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12.w), - child: Row( - children: [ - text14400white( - "Message user"), - const Spacer(), - Image.asset( - "assets/images/png/fluent_chat-20-22.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), + sizedBoxWidth(10.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + followingobj! + .data![index] + .following! + .fullName == + null || + followingobj! + .data![index] + .following! + .fullName! + .isEmpty + ? text16w400_FCFCFC("Regroup") + : text16w400_FCFCFC( + followingobj! + .data![index] + .following! + .fullName!), + sizedBoxHeight(4.h), + followingobj! + .data![index] + .following! + .userName == + null || + followingobj! + .data![index] + .following! + .userName! + .isEmpty + ? text12w400_FCFCFC_blur( + "regroup") + : text12w400_FCFCFC_blur( + followingobj!.data![index] + .following!.userName!) ], - child: Container( - height: 20, - width: 20, - child: Center( - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 22.h, - width: 4.w, - ), ), - )), + const Spacer(), + PopupMenuButton( + surfaceTintColor: + const Color(0xFF222935), + constraints: + BoxConstraints.tightFor( + width: 176.w), + offset: const Offset(0, 20), + color: const Color(0xFF222935), + tooltip: "", + itemBuilder: + (BuildContext context) => + [ + PopupMenuItem( + onTap: () async { + setState(() { + unfollowid = followingobj! + .data![ + index] + .following! + .id ?? + 0; + // followingobj!.data!.removeAt(index); + followingobj! + .data! + .removeWhere((item) => + item.following! + .id == + unfollowid); + Uploadata(); + }); + }, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Unfollow user"), + const Spacer(), + Image.asset( + "assets/images/png/Black1323e.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + const PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 12.w), + child: Row( + children: [ + text14400white( + "Message user"), + const Spacer(), + Image.asset( + "assets/images/png/fluent_chat-20-22.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + ], + child: Container( + height: 20, + width: 20, + child: Center( + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 22.h, + width: 4.w, + ), + ), + )), + ], + ), + ), ], ), - ), - ], + ); + }, ); - }, - ); - } - }, + } + }, + ), + ], ), - ], - ), - ] - ); + ]); } Widget _buildNoDataBody(context) { diff --git a/lib/Utils/Common/ShimmerCommon.dart b/lib/Utils/Common/ShimmerCommon.dart index 40e73bb..593b7d0 100644 --- a/lib/Utils/Common/ShimmerCommon.dart +++ b/lib/Utils/Common/ShimmerCommon.dart @@ -7,7 +7,7 @@ class ShimmerCommon extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Color(0xffFFF3E4), body: _buildShimmerBody()); + backgroundColor: Color(0xFF222935), body: _buildShimmerBody()); } // Build shimmer effect for the body @@ -28,8 +28,8 @@ class ShimmerCommon extends StatelessWidget { // Build shimmer UI for InsightWidget Widget _buildShimmerInsightWidget() { return Shimmer.fromColors( - baseColor: Colors.grey[300]!, - highlightColor: Colors.grey[100]!, + baseColor: Colors.grey[500]!, + highlightColor: Colors.grey[300]!, child: Container( padding: EdgeInsets.all(16.0), child: Column( @@ -38,25 +38,25 @@ class ShimmerCommon extends StatelessWidget { Container( width: double.infinity, height: 20, - color: Colors.grey[300], + color: Colors.grey[500], ), SizedBox(height: 8), Container( width: double.infinity, height: 20, - color: Colors.grey[300], + color: Colors.grey[500], ), SizedBox(height: 8), Container( width: double.infinity, height: 20, - color: Colors.grey[300], + color: Colors.grey[500], ), SizedBox(height: 8), Container( width: double.infinity, height: 20, - color: Colors.grey[300], + color: Colors.grey[500], ), ], ), -- 2.34.1 From c5b6a2e53695c336160aa1fe198b97df9b08c0bc Mon Sep 17 00:00:00 2001 From: Shubhamshirva Date: Thu, 25 Jul 2024 15:40:33 +0530 Subject: [PATCH 08/21] some bugs resolved in guest view and profile view --- lib/Common/CommonWidget.dart | 68 ++ lib/Common/api_urls.dart | 18 +- .../Certificate/AddCertificate.dart | 4 +- .../ProfileTab/Certificate/Certificate.dart | 62 +- .../EditProfile/View/ProfileTab.dart | 119 +- .../EditProfile/ViewModel/EditProfileApi.dart | 2 + .../Model/GuestGetProfileDataIndi.dart | 7 +- .../View/Individual/ProfileTabIndGuest.dart | 664 ++++++++-- .../ProfileTab/Model/certificateModel.dart | 68 ++ .../ProfileTab/Settings/AccountSetting.dart | 82 +- .../ProfileTab/Settings/HelpAndSupport.dart | 94 +- .../ProfileTab/Settings/Settings.dart | 64 +- .../ProfileTab/TimeLine/AddTimeline.dart | 1083 ++++++++--------- .../view_model/profileGetmethod.dart | 17 + .../view_model/profilePostmethod.dart | 77 +- .../sidemenu/Community/Group/view/Group.dart | 717 +++++++---- .../sidemenu/Model/joineGroupsModel.dart | 184 +++ .../sidemenu/view_model/getmethod.dart | 26 + .../sidemenu/view_model/postmethod.dart | 0 lib/Utils/texts.dart | 11 + .../Signup/view_model/getUserprofile.dart | 2 + 21 files changed, 2319 insertions(+), 1050 deletions(-) create mode 100644 lib/Feed Module/Main_Screens/ProfileTab/Model/certificateModel.dart create mode 100644 lib/Feed Module/sidemenu/Model/joineGroupsModel.dart create mode 100644 lib/Feed Module/sidemenu/view_model/getmethod.dart create mode 100644 lib/Feed Module/sidemenu/view_model/postmethod.dart diff --git a/lib/Common/CommonWidget.dart b/lib/Common/CommonWidget.dart index c0ed6d9..afb32f8 100644 --- a/lib/Common/CommonWidget.dart +++ b/lib/Common/CommonWidget.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; @@ -265,6 +266,73 @@ Widget stackContainers({ ); } +Widget stackContainersGroups({ + required String number, + required List containerImages, +}) { + // Define the maximum number of images to display + const maxImagesToShow = 3; + + // Calculate the number of images to show and the remaining count + final remainingCount = containerImages.length - maxImagesToShow; + final imagesToShow = containerImages.take(maxImagesToShow).toList(); + + return Row( + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFFD90B2E), + border: Border.all(color: Color(0xFF2C3742), width: 1), + ), + child: Center( + child: Text( + remainingCount > 0 ? '+$remainingCount' : '', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 8, + ), + ), + ), + ), + Positioned( + left: 22.w, + child: SizedBox( + height: 30, + width: 30 * maxImagesToShow.toDouble(), + child: Stack( + clipBehavior: Clip.none, + children: List.generate(imagesToShow.length, (index) { + return Positioned( + left: index * 22.0, + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(color: Color(0xFF2C3742), width: 1), + ), + child: CircleAvatar( + backgroundImage: NetworkImage(imagesToShow[index]), + ), + ), + ); + }), + ), + ), + ), + ], + ), + ], + ); +} + Widget stackContainers2({ required List containerImages, }) { diff --git a/lib/Common/api_urls.dart b/lib/Common/api_urls.dart index 73385c8..afd85c2 100644 --- a/lib/Common/api_urls.dart +++ b/lib/Common/api_urls.dart @@ -34,7 +34,6 @@ class ApiUrls { static const getuserdetails = "${baseUrl}get-auth-user-data"; - static const getfaqs = "${baseUrl}fetch-faqs"; static const getprivacypolicy = "${baseUrl}fetch-privacy-policy"; @@ -83,11 +82,9 @@ class ApiUrls { static const postuserdevice = "${baseUrl}store-account-session"; + static const getmyjoinedgroups = "${baseUrl}my-joined-groups"; - - - - + static const getusercertificates = "${baseUrl}my-certificates"; static const postnotification = "${baseUrl}update-notification-settings"; static const getnotification = "${baseUrl}fetch-notification-settings"; @@ -95,7 +92,6 @@ class ApiUrls { static const getblockuser = "${baseUrl}fetch-blocked-profile"; static const postblockuser = "${baseUrl}block-profile"; - // Individual static const posteditprofile = "${baseUrl}update-profile"; static const geteditprofile = "${baseUrl}fetch-profile"; @@ -106,13 +102,11 @@ class ApiUrls { //Guest - static const getGuestProfileInd = "${baseUrl}get-guest-view-of-individual-user-profile"; - static const getGuestProfileBus = "${baseUrl}get-guest-view-of-business-user-profile"; - + static const getGuestProfileInd = + "${baseUrl}get-guest-view-of-individual-user-profile"; + static const getGuestProfileBus = + "${baseUrl}get-guest-view-of-business-user-profile"; static const getGuestfollowers = "${baseUrl}get-guest-user-followers"; static const getGuestfollowing = "${baseUrl}get-guest-user-following"; - - - } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart index b7c02ec..a1ffd3a 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/AddCertificate.dart @@ -15,6 +15,7 @@ import 'package:regroup/Utils/Common/ImageUpload.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; import 'package:path/path.dart' as path; @@ -115,7 +116,8 @@ class _AddCertificateState extends State { final data = await Profilepostmethod().postCertification(formdata); if (data.status == ResponseStatus.SUCCESS) { Get.back(); - Get.back(); + // Get.back(); + Get.toNamed(RouteName.mainscreen, arguments: 4); return utils.showToast(data.message); } else { Get.back(); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart index 370bcb3..6748349 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Certificate/Certificate.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; +import 'package:get/get.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; @@ -40,6 +41,17 @@ class _CertificateState extends State { }, ]; + late Future myfuture; + int id = Get.arguments["id"]; + + @override + void initState() { + // TODO: implement initState + + myfuture = Profilegetmethod().getUserCertificates(id); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -51,7 +63,7 @@ class _CertificateState extends State { ), resizeToAvoidBottomInset: false, body: FutureBuilder( - future: EditProfileApi().getEditProfileIndividual(), + future: myfuture, builder: (ctx, snapshot) { if (snapshot.data == null) { return const Column( @@ -76,7 +88,7 @@ class _CertificateState extends State { ); } } - return getEditProfileIndi!.data!.certifications!.isEmpty + return certificateobj!.data!.isEmpty ? _buildNoDataBody(context) : _buildBody(context); }, @@ -126,51 +138,43 @@ class _CertificateState extends State { crossAxisSpacing: 8, childAspectRatio: 0.65, ), - itemCount: - getEditProfileIndi!.data!.certifications!.length, + itemCount: certificateobj!.data!.length, itemBuilder: (context, index) { return Column( // mainAxisAlignment: MainAxisAlignment.start, children: [ - getEditProfileIndi!.data!.certifications![index] - .certificationImage == + certificateobj!.data![index].certificationImage == null || - getEditProfileIndi! - .data! - .certifications![index] - .certificationImage! - .isEmpty + certificateobj!.data![index] + .certificationImage!.isEmpty ? Image.asset( CertificateData[index]["imagePath"], height: 100.h, width: 105.w, ) : Image.network( - getEditProfileIndi! - .data! - .certifications![index] - .certificationImage!, + certificateobj! + .data![index].certificationImage!, height: 100.h, width: 105.w, - ), + errorBuilder: (context, error, stackTrace) { + // Error handling when image fails to load + return Image.asset( + CertificateData[index]["imagePath"], + fit: BoxFit.cover, + ); + }), Expanded( child: Center( child: text14w400_FCFCFC( - getEditProfileIndi! - .data! - .certifications![index] + certificateobj!.data![index] .certificationName == null || - getEditProfileIndi! - .data! - .certifications![index] - .certificationName! - .isEmpty + certificateobj!.data![index] + .certificationName!.isEmpty ? CertificateData[index]["text"] - : getEditProfileIndi! - .data! - .certifications![index] - .certificationName, + : certificateobj! + .data![index].certificationName, textAlign: TextAlign.center, ), ), diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index e3c1880..5a77235 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -114,8 +114,10 @@ class _ProfileTabState extends State { setValues() async { if (isOnce) { SharedPreferences prefs = await SharedPreferences.getInstance(); - accountTypeValue = prefs.getString('accountTypeValue'); + // accountTypeValue = prefs.getString('accountTypeValue'); accounTypeLogin = prefs.getString('accountTypefromLogin'); + print('account tupe login is $accounTypeLogin'); + // print('account tupe value is $accountTypeValue'); if (getEditProfileIndi!.data!.interest != null) { // Join all interest names with a comma separator @@ -130,8 +132,10 @@ class _ProfileTabState extends State { setValues2() async { if (isOnce) { SharedPreferences prefs = await SharedPreferences.getInstance(); - accountTypeValue = prefs.getString('accountTypeValue'); + // accountTypeValue = prefs.getString('accountTypeValue'); accounTypeLogin = prefs.getString('accountTypefromLogin'); + print('account tupe login is $accounTypeLogin'); + // print('account tupe value is $accountTypeValue'); // foodItemDropdownController.selectedFooddynamic.clear(); // foodItemDropdownController.foodItemQControllerList.clear(); // foodItemDropdownController.OtherFoodIngredientList.clear(); @@ -197,18 +201,20 @@ class _ProfileTabState extends State { backgroundColor: Color(0xFF222935), extendBody: true, // accountTypeValue == '1' || - body: accounTypeLogin == '1' || accountTypeValue == '1' + body: accounTypeLogin == '1' + // || accountTypeValue == '1' ? FutureBuilder( future: individualfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return ShimmerCommon(); + return + // ShimmerCommon(); - // Center( - // child: CircularProgressIndicator( - // color: Colors.blue, - // ), - // ); + Center( + child: CircularProgressIndicator( + color: Colors.blue, + ), + ); } if (snapshot.hasError) { @@ -239,13 +245,30 @@ class _ProfileTabState extends State { Stack( children: [ Container( - height: 484.h, - width: double.infinity, - child: Image.asset( - "assets/images/png/profileimg.png", - fit: BoxFit.cover, - ), - ), + height: 484.h, + width: double.infinity, + child: getEditProfileIndi! + .data!.profilePhoto == + null || + getEditProfileIndi! + .data!.profilePhoto!.isEmpty + ? Image.asset( + "assets/images/png/profileimg.png", + fit: BoxFit.cover, + ) + : Image.network( + getEditProfileIndi! + .data!.profilePhoto!, + fit: BoxFit.cover, + errorBuilder: + (context, error, stackTrace) { + // Error handling when image fails to load + return Image.asset( + "assets/images/png/profileimg.png", + fit: BoxFit.cover, + ); + }, + )), Positioned.fill( child: Container( decoration: BoxDecoration( @@ -746,10 +769,15 @@ class _ProfileTabState extends State { getEditProfileIndi!.data!.timelines![index].abilities!.length, itemBuilder: (context, innerIndex) { - List abilityName = getEditProfileIndi!.data!.timelines![index].abilities![innerIndex].name!.split('pattern'); + String abilityName = getEditProfileIndi!.data!.timelines![index].abilities![innerIndex].name!; + // List abilityName = getEditProfileIndi!.data!.timelines![index].abilities![innerIndex].name!.split(','); + // String formattedNames = abilityName.join(', '); + List abilityNames = abilityName.split(',').map((e) => e.trim()).toList(); + String formattedNames = abilityNames.join(', '); + print(formattedNames); return Padding( padding: EdgeInsets.only(right: 8.w), - child: text10400whiteblur(abilityName.toString()), + child: text10400whiteblur(formattedNames), ); }, ), @@ -783,6 +811,9 @@ class _ProfileTabState extends State { onTap: () { Get.toNamed( RouteName.certificate, + arguments: { + 'id': getEditProfileIndi!.data!.id, + } ); }, child: text16400white('View more')) @@ -969,17 +1000,28 @@ class _ProfileTabState extends State { }, child: Align( alignment: Alignment.centerRight, - child: text16400white( + child: text18w400white( 'Add certificate'))), - sizedBoxHeight(10.h), + sizedBoxHeight(25.h), ]), ), Padding( padding: EdgeInsets.symmetric(horizontal: 16.w), child: Row( - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ text18w700white("Groups"), + InkWell( + onTap: () { + Get.toNamed( + RouteName.group, + arguments: { + 'id': getEditProfileIndi!.data!.id, + } + ); + }, + child: text16400white('View more')) ], ), ), @@ -1078,7 +1120,13 @@ class _ProfileTabState extends State { future: businessfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return ShimmerCommon(); + return + // ShimmerCommon(); + Center( + child: CircularProgressIndicator( + color: Colors.blue, + ), + ); } if (snapshot.hasError) { @@ -1973,14 +2021,25 @@ class _ProfileTabState extends State { return Column( children: [ Container( - height: 109.h, - width: 100.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.r), - ), - child: imagePath == null || imagePath.isEmpty - ? Image.asset('assets/images/png/Rectangle 29ss.png') - : Image.network(imagePath)), + height: 109.h, + width: 100.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + ), + child: imagePath == null || imagePath.isEmpty + ? Image.asset('assets/images/png/Rectangle 29ss.png') + : Image.network( + imagePath, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + // Error handling when image fails to load + return Image.asset( + 'assets/images/png/Rectangle 29ss.png', + fit: BoxFit.cover, + ); + }, + ), + ), sizedBoxHeight(10.h), SizedBox( width: 100.w, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart index aee5e5d..6aec043 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart @@ -88,4 +88,6 @@ class EditProfileApi { return response; } + + } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart index 97a9af1..9e8fe7d 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/Model/GuestGetProfileDataIndi.dart @@ -47,6 +47,7 @@ class Data { // List? myJoinedSubgroups; List? certifications; int? daysBeforeJoined; + int? isIamFollowingToGuestUser; Data( {this.id, @@ -68,7 +69,9 @@ class Data { this.myJoinedGroups, // this.myJoinedSubgroups, this.certifications, - this.daysBeforeJoined}); + this.daysBeforeJoined, + this.isIamFollowingToGuestUser, + }); Data.fromJson(Map json) { id = json['id']; @@ -117,6 +120,7 @@ class Data { }); } daysBeforeJoined = json['days_before_joined']; + isIamFollowingToGuestUser = json['is_iam_following_to_guest_user']; } Map toJson() { @@ -156,6 +160,7 @@ class Data { this.certifications!.map((v) => v.toJson()).toList(); } data['days_before_joined'] = this.daysBeforeJoined; + data['is_iam_following_to_guest_user'] = this.isIamFollowingToGuestUser; return data; } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart index 48aa32d..15c712b 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -5,11 +5,15 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Guest%20User/ViewModel/GuestProfileApi.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; +import 'package:intl/intl.dart'; class ProfileTabIndGuest extends StatefulWidget { const ProfileTabIndGuest({super.key}); @@ -97,6 +101,38 @@ class _ProfileTabIndGuestState extends State { super.initState(); } + int? followunfollowid; + + FollowUnfollowUploadata() async { + utils.loader(); + Map updata = { + "following_iam_principal_xid": followunfollowid, + }; + final data = await Profilepostmethod().postunfollowuser(updata); + if (data.status == ResponseStatus.SUCCESS) { + Get.back(); + // return utils.showToast(data.message); + } else { + Get.back(); + print("unfollow not done"); + return utils.showToast(data.message); + } + } + + // void _handleFollowButton(id) async { + // try { + // var resp = await Profilepostmethod().guestFollowuser(id ?? ""); + // if (resp) { + // setState(() { + // // isFollow = !isFollow!; + // }); + // } + // } catch (e) { + // // Handle error here + // print('Error Following user: $e'); + // } + // } + @override Widget build(BuildContext context) { return Scaffold( @@ -221,11 +257,10 @@ class _ProfileTabIndGuestState extends State { children: [ text16400white( guestGetProfileInd! - .data! - .follows! - .followers - .toString() ?? - "254"), + .data! + .follows! + .followers + .toString()), sizedBoxHeight(6.h), text12400whiteblur( "Followers") @@ -264,11 +299,10 @@ class _ProfileTabIndGuestState extends State { children: [ text16400white( guestGetProfileInd! - .data! - .follows! - .following - .toString() ?? - "254"), + .data! + .follows! + .following + .toString()), sizedBoxHeight(6.h), text12400whiteblur( "Following") @@ -329,19 +363,40 @@ class _ProfileTabIndGuestState extends State { children: [ GestureDetector( onTap: () { - Get.toNamed(RouteName.editProfile); + // Get.toNamed(RouteName.editProfile); + followunfollowid = + guestGetProfileInd!.data!.id; + FollowUnfollowUploadata(); + print(followunfollowid); + // _handleFollowButton(followunfollowid); }, - child: Container( - height: 40.h, - width: 170.w, - decoration: BoxDecoration( - color: const Color(0xFFD90B2E), - borderRadius: - BorderRadius.circular(30.r), - ), - child: Center( - child: text16w400_FCFCFC("Follow")), - ), + child: guestGetProfileInd!.data! + .isIamFollowingToGuestUser == + 0 + ? Container( + height: 40.h, + width: 170.w, + decoration: BoxDecoration( + color: const Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular(30.r), + ), + child: Center( + child: text16w400_FCFCFC( + "Follow")), + ) + : Container( + height: 40.h, + width: 170.w, + decoration: BoxDecoration( + color: const Color(0xFFD90B2E), + borderRadius: + BorderRadius.circular(30.r), + ), + child: Center( + child: text16w400_FCFCFC( + "Unfollow")), + ), ), GestureDetector( onTap: () { @@ -367,8 +422,11 @@ class _ProfileTabIndGuestState extends State { sizedBoxHeight(30.h), text18w700white("About"), sizedBoxHeight(10.h), - text14400white( - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), + guestGetProfileInd!.data!.about == null || + guestGetProfileInd!.data!.about!.isEmpty + ? text14400white("No about added") + : text14400white( + guestGetProfileInd!.data!.about!), sizedBoxHeight(25.h), Row( children: [ @@ -412,7 +470,7 @@ class _ProfileTabIndGuestState extends State { text14400whiteblur( 'Rowing, Football, Swimming'), // interestText - // text14400whiteblur(getEditProfileIndi! + // text14400whiteblur(guestGetProfileInd! // .data!.interest! // .join(', ')), // text14400whiteblur( @@ -485,16 +543,16 @@ class _ProfileTabIndGuestState extends State { children: [ text18w700white("Timeline"), const Spacer(), - InkWell( - onTap: () { - Get.toNamed(RouteName.addtimeline); - }, - child: Image.asset( - "assets/images/png/iconamoon_edit-thin.png", - height: 20.h, - width: 20.w, - ), - ) + // InkWell( + // onTap: () { + // Get.toNamed(RouteName.addtimeline); + // }, + // child: Image.asset( + // "assets/images/png/iconamoon_edit-thin.png", + // height: 20.h, + // width: 20.w, + // ), + // ) ], ), sizedBoxHeight(20.h), @@ -507,39 +565,262 @@ class _ProfileTabIndGuestState extends State { "No Timeline Found")), ) : SizedBox( - height: 300.h, + height: 200.h, child: ListView.builder( shrinkWrap: true, itemCount: guestGetProfileInd! .data!.timelines!.length, itemBuilder: (context, index) { - var abilities; - abilities = guestGetProfileInd! - .data! - .timelines![index] - .abilities! - .map((e) => e.name) - .join(', '); - return commonTimelineCard( - imagePath: timeline[index] - ["imagePath"], - title: guestGetProfileInd! - .data! - .timelines![index] - .teamName ?? - '', - teamName: guestGetProfileInd! - .data! - .timelines![index] - .teamName ?? - '', - abilities: abilities, - startendDate: - "${guestGetProfileInd!.data!.timelines![index].startDate} - ${guestGetProfileInd!.data!.timelines![index].endDate} " ?? - '', + DateTime startDate = + DateTime.parse( + guestGetProfileInd! + .data! + .timelines![index] + .startDate!); + DateTime endDate = DateTime.parse( + guestGetProfileInd! + .data! + .timelines![index] + .endDate!); + + String formattedStartDate = + DateFormat('dd MMMM yyyy') + .format(startDate); + String formattedEndDate = + DateFormat('dd MMMM yyyy') + .format(endDate); + + // Combine formatted dates + String startToEnd = + '$formattedStartDate - $formattedEndDate'; + + var timeline = guestGetProfileInd! + .data!.timelines![index]; + + // List> + // abilities = + // timeline.abilities! + // .map((ability) => { + // 'id': ability.id, + // 'name': + // ability.name, + // }) + // .toList(); + return Row( + children: [ + Container( + width: 10, + height: 170.h, + child: Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 50.h, + child: Container( + height: 11.h, + width: 11.w, + decoration: BoxDecoration( + color: Colors + .white, + shape: BoxShape + .circle)), + ), + Positioned( + right: 3.w, + child: Container( + width: 1.w, + height: 170.h, + decoration: + BoxDecoration( + color: Colors + .white), + ), + ), + ], + ), + ), + sizedBoxWidth(20.w), + Expanded( + child: Column( + children: [ + commonGlassUI( + width: + double.infinity, + height: 155.h, + borderRadius: + BorderRadius + .circular( + 10.r), + customWidget: Padding( + padding: + EdgeInsets.only( + left: 16.w, + right: 16.w, + top: 10.h), + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Row( + children: [ + guestGetProfileInd?.data?.profilePhoto == null || + guestGetProfileInd!.data!.profilePhoto!.isEmpty + ? CircleAvatar(radius: 10.r, backgroundImage: AssetImage('assets/images/png/cimg1.png')) + : CircleAvatar(radius: 10.r, backgroundImage: NetworkImage(guestGetProfileInd!.data!.profilePhoto!)), + sizedBoxWidth( + 8.w), + guestGetProfileInd!.data!.timelines![index].clubName == null || + guestGetProfileInd!.data!.timelines![index].clubName!.isEmpty + ? text14700white('Regroup') + : text14700white(guestGetProfileInd!.data!.timelines![index].clubName!) + ], + ), + ], + ), + sizedBoxHeight( + 10.h), + guestGetProfileInd!.data!.timelines![index].roleName == + null || + guestGetProfileInd! + .data! + .timelines![ + index] + .roleName! + .isEmpty + ? text12700white( + 'regroup') + : text12700white(guestGetProfileInd! + .data! + .timelines![ + index] + .roleName!), + sizedBoxHeight( + 10.h), + guestGetProfileInd!.data!.timelines![index].teamName == + null || + guestGetProfileInd! + .data! + .timelines![ + index] + .teamName! + .isEmpty + ? text12700white( + 'regroup') + : text12700white(guestGetProfileInd! + .data! + .timelines![ + index] + .teamName!), + sizedBoxHeight( + 10.h), + startToEnd + .isEmpty + ? text12400white( + 'No date') + : text12400white( + startToEnd), + sizedBoxHeight( + 10.h), + guestGetProfileInd!.data!.timelines![index].abilities == + null || + guestGetProfileInd! + .data! + .timelines![ + index] + .abilities! + .isEmpty + ? text10400whiteblur( + 'No data') + : Container( + height: + 30.h, // Adjust the height as needed + child: ListView + .builder( + shrinkWrap: + true, + scrollDirection: + Axis.horizontal, + itemCount: guestGetProfileInd! + .data! + .timelines![index] + .abilities! + .length, + itemBuilder: + (context, innerIndex) { + String + abilityName = + guestGetProfileInd!.data!.timelines![index].abilities![innerIndex].name!; + // List abilityName = guestGetProfileInd!.data!.timelines![index].abilities![innerIndex].name!.split(','); + // String formattedNames = abilityName.join(', '); + List + abilityNames = + abilityName.split(',').map((e) => e.trim()).toList(); + String + formattedNames = + abilityNames.join(', '); + print(formattedNames); + return Padding( + padding: EdgeInsets.only(right: 8.w), + child: text10400whiteblur(formattedNames), + ); + }, + ), + ), + ], + ), + ), + // border: 1 + ), + ], + ), + ), + ], ); }, - )), + ) + + // ListView.builder( + // shrinkWrap: true, + // itemCount: guestGetProfileInd! + // .data!.timelines!.length, + // itemBuilder: (context, index) { + // var abilities; + // abilities = guestGetProfileInd! + // .data! + // .timelines![index] + // .abilities! + // .map((e) => e.name) + // .join(', '); + // return commonTimelineCard( + // imagePath: timeline[index] + // ["imagePath"], + // title: guestGetProfileInd! + // .data! + // .timelines![index] + // .teamName ?? + // '', + // teamName: guestGetProfileInd! + // .data! + // .timelines![index] + // .teamName ?? + // '', + // abilities: abilities, + // startendDate: + // "${guestGetProfileInd!.data!.timelines![index].startDate} - ${guestGetProfileInd!.data!.timelines![index].endDate} " ?? + // '', + // ); + // }, + // ) + ), sizedBoxHeight(30.h), Row( children: [ @@ -548,7 +829,11 @@ class _ProfileTabIndGuestState extends State { const Spacer(), InkWell( onTap: () { - Get.toNamed(RouteName.certificate); + Get.toNamed(RouteName.certificate, + arguments: { + 'id': guestGetProfileInd! + .data!.id, + }); }, child: text12400white("View more")), ], @@ -564,44 +849,161 @@ class _ProfileTabIndGuestState extends State { "No Certifications Found")), ) : SizedBox( - height: 85.h, + height: 100.h, child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, - itemCount: guestGetProfileInd!.data! - .certifications!.length ?? - certificationData.length, + // padding: + // EdgeInsets.only(left: 16.w), + physics: ScrollPhysics(), + itemCount: guestGetProfileInd! + .data!.certifications!.length, itemBuilder: (context, index) { - var certifiData = - guestGetProfileInd!.data! - .certifications![index]; - return Padding( - padding: EdgeInsets.only( - right: 20.w), - child: certificationCardTile( - imagePath: certifiData - .certificationImage ?? - certificationData[index] - ["imagePath"], - title: certifiData - .certificationName ?? - certificationData[index] - ["title"], - subtitle: certifiData - .certificationReason ?? - certificationData[index] - ["subtitle"], - date: - ("Issued ${certifiData.certificationDate}") ?? - (certificationData[ - index] - ["date"])), + return Row( + children: [ + commonGlassUI( + width: 266.w, + height: 70.h, + borderRadius: + BorderRadius.circular( + 10.r), + customWidget: Padding( + padding: EdgeInsets + .symmetric( + horizontal: + 16.w, + vertical: 5.h), + child: Row( + mainAxisAlignment: + MainAxisAlignment + .start, + crossAxisAlignment: + CrossAxisAlignment + .center, + children: [ + guestGetProfileInd! + .data! + .certifications![ + index] + .certificationImage == + null || + guestGetProfileInd! + .data! + .certifications![ + index] + .certificationImage! + .isEmpty + ? Image.asset( + 'assets/images/png/image 17.png', + width: 57.w, + height: + 40.h, + ) + : Image.network( + guestGetProfileInd! + .data! + .certifications![ + index] + .certificationImage!, + width: 77.w, + height: + 100.h, + ), + sizedBoxWidth(20.w), + Column( + crossAxisAlignment: + CrossAxisAlignment + .center, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + guestGetProfileInd!.data!.certifications![index].certificationName == + null || + guestGetProfileInd! + .data! + .certifications![ + index] + .certificationName! + .isEmpty + ? text12400white( + 'Regroup') + : text12400white(guestGetProfileInd! + .data! + .certifications![ + index] + .certificationName!), + sizedBoxHeight( + 4.h), + guestGetProfileInd!.data!.certifications![index].certificationReason == + null || + guestGetProfileInd! + .data! + .certifications![ + index] + .certificationReason! + .isEmpty + ? text9400white( + 'Regroup') + : text9400white(guestGetProfileInd! + .data! + .certifications![ + index] + .certificationName!), + sizedBoxHeight( + 4.h), + guestGetProfileInd!.data!.certifications![index].certificationDate == + null || + guestGetProfileInd! + .data! + .certifications![index] + .certificationDate! + .isEmpty + ? Text( + 'Regroup', + style: TextStyle( + fontSize: + 9.sp, + fontWeight: FontWeight.w400, + color: Color(0xffFFFFFF).withOpacity(0.70), + fontFamily: 'Helvetica'), + ) + : Text( + 'Issued ${DateFormat('MMM yyyy').format(DateTime.parse(guestGetProfileInd!.data!.certifications![index].certificationDate!))}', + style: TextStyle( + fontSize: + 9.sp, + fontWeight: FontWeight.w400, + color: Color(0xffFFFFFF).withOpacity(0.70), + fontFamily: 'Helvetica'), + ) + ], + ), + ], + ), + )), + sizedBoxWidth(20.w), + ], ); }, - ), - ), + )), sizedBoxHeight(30.h), - text18w400white("Groups"), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + text18w700white("Groups"), + InkWell( + onTap: () { + Get.toNamed(RouteName.group, + arguments: { + 'id': guestGetProfileInd! + .data!.id, + }); + }, + child: text12400white('View more')) + ], + ), ]), ), sizedBoxHeight(20.h), @@ -609,11 +1011,12 @@ class _ProfileTabIndGuestState extends State { ? Padding( padding: EdgeInsets.symmetric(vertical: 30.h), child: Center( - child: text18w700white( - "No groups Found")), + child: + text18w700white("No groups Found")), ) : SizedBox( height: 190.h, + width: double.infinity, child: ListView.builder( shrinkWrap: true, scrollDirection: Axis.horizontal, @@ -621,18 +1024,24 @@ class _ProfileTabIndGuestState extends State { itemCount: guestGetProfileInd! .data!.myJoinedGroups!.length, itemBuilder: (context, index) { - var subGroupData = guestGetProfileInd! - .data! - .myJoinedGroups![index] - .groupData!; return Padding( padding: EdgeInsets.only(right: 20.w), child: profilecardtile( - imagePath: subGroupData + imagePath: guestGetProfileInd! + .data! + .myJoinedGroups![index] + .groupData! .groupImage ?? - cardtile[index]["imagePath"], - title: subGroupData.title ?? - cardtile[index]["title"]), + '', + // cardtile[index]["imagePath"], + title: guestGetProfileInd! + .data! + .myJoinedGroups![index] + .groupData! + .title! + + // cardtile[index]["title"] + ), ); }, ), @@ -1304,34 +1713,35 @@ class _ProfileTabIndGuestState extends State { )); } - Widget profilecardtile({required String imagePath, required String title}) { + Widget profilecardtile({required String? imagePath, required String? title}) { return Column( children: [ - guestGetProfileInd!.data!.myJoinedGroups!.isNotEmpty - ? Container( - width: 100.w, - height: 109.h, - decoration: ShapeDecoration( - image: DecorationImage( - image: Image( - image: NetworkImage(imagePath), - ).image, - fit: BoxFit.cover, - ), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.r)), + Container( + height: 109.h, + width: 100.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.r), + ), + child: imagePath == null || imagePath.isEmpty + ? Image.asset('assets/images/png/Rectangle 29ss.png') + : Image.network( + imagePath, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + // Error handling when image fails to load + return Image.asset( + 'assets/images/png/Rectangle 29ss.png', + fit: BoxFit.cover, + ); + }, ), - ) - : Container( - height: 109.h, - width: 100.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.r), - ), - child: Image.asset(imagePath), - ), + ), sizedBoxHeight(10.h), - SizedBox(width: 100.w, child: text12w700_FCFCFC(title)), + SizedBox( + width: 100.w, + child: title == null || title.isEmpty + ? text12w700_FCFCFC('Reegroup') + : text12w700_FCFCFC(title)), ], ); } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Model/certificateModel.dart b/lib/Feed Module/Main_Screens/ProfileTab/Model/certificateModel.dart new file mode 100644 index 0000000..f5c80a2 --- /dev/null +++ b/lib/Feed Module/Main_Screens/ProfileTab/Model/certificateModel.dart @@ -0,0 +1,68 @@ +class CertificateuserModel { + String? status; + int? statusCode; + String? message; + List? data; + + CertificateuserModel({this.status, this.statusCode, this.message, this.data}); + + CertificateuserModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + String? certificationName; + String? certificationImage; + String? certificationReason; + String? certificationDate; + int? iamPrincipalXid; + + Data( + {this.id, + this.certificationName, + this.certificationImage, + this.certificationReason, + this.certificationDate, + this.iamPrincipalXid}); + + Data.fromJson(Map json) { + id = json['id']; + certificationName = json['certification_name']; + certificationImage = json['certification_image']; + certificationReason = json['certification_reason']; + certificationDate = json['certification_date']; + iamPrincipalXid = json['iam_principal_xid']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['certification_name'] = this.certificationName; + data['certification_image'] = this.certificationImage; + data['certification_reason'] = this.certificationReason; + data['certification_date'] = this.certificationDate; + data['iam_principal_xid'] = this.iamPrincipalXid; + return data; + } +} diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart index 9e9d517..9818002 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/AccountSetting.dart @@ -24,6 +24,26 @@ class AccountSettings extends StatefulWidget { class _AccountSettingsState extends State { // bool swichvalue = false; + String? accountTypeValue; + String? accounTypeLogin; + + @override + void initState() { + setValues(); + super.initState(); + } + + setValues() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + // Update state variables and trigger UI update with setState + setState(() { + accounTypeLogin = prefs.getString('accountTypefromLogin'); + print('account type login is $accounTypeLogin'); + // accountTypeValue = prefs.getString('accountTypeValue'); + // print('account type value is $accountTypeValue'); + }); + } + Future UploadData() async { print("upload data called"); SharedPreferences prefs = await SharedPreferences.getInstance(); @@ -91,35 +111,43 @@ else if (accountype == "2") { child: text18w700_FCFCFC("Sign in & security"), ), sizedBoxHeight(20.h), - Padding( - padding: - EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), - child: Row(children: [ - Image.asset( - "assets/images/png/eyeIcon.png", - height: 21.h, - width: 21.w, - ), - sizedBoxWidth(12.w), - text16w400_FCFCFC("Account visibility"), - Spacer(), - Transform.scale( - scale: 0.9, - child: CupertinoSwitch( - value: accountvisibility, - trackColor: Colors.white.withOpacity(0.4), - activeColor: Color(0xFF34C759), - onChanged: (bool value) { - setState(() { - accountvisibility = value; - UploadData(); + accounTypeLogin == '1' + ? - // swichvalue = value ?? false; - }); - })) - ]), - ), + Column( + children: [ + Padding( + padding: + EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), + child: Row(children: [ + Image.asset( + "assets/images/png/eyeIcon.png", + height: 21.h, + width: 21.w, + ), + sizedBoxWidth(12.w), + text16w400_FCFCFC("Account visibility"), + Spacer(), + Transform.scale( + scale: 0.9, + child: CupertinoSwitch( + value: accountvisibility, + trackColor: Colors.white.withOpacity(0.4), + activeColor: Color(0xFF34C759), + onChanged: (bool value) { + setState(() { + accountvisibility = value; + UploadData(); + + // swichvalue = value ?? false; + }); + })) + ]), + ), commonDivider(), + ], + ) + : SizedBox(), GestureDetector( onTap: () { Get.toNamed(RouteName.changepassword); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/HelpAndSupport.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/HelpAndSupport.dart index abcdaeb..037ec29 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/HelpAndSupport.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/HelpAndSupport.dart @@ -7,6 +7,7 @@ import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/texts.dart'; import 'package:regroup/resources/routes/route_name.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class HelpAndSupport extends StatefulWidget { const HelpAndSupport({super.key}); @@ -16,6 +17,26 @@ class HelpAndSupport extends StatefulWidget { } class _HelpAndSupportState extends State { + String? accountTypeValue; + String? accounTypeLogin; + + @override + void initState() { + setValues(); + super.initState(); + } + + setValues() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + // Update state variables and trigger UI update with setState + setState(() { + accounTypeLogin = prefs.getString('accountTypefromLogin'); + print('account type login is $accounTypeLogin'); + // accountTypeValue = prefs.getString('accountTypeValue'); + // print('account type value is $accountTypeValue'); + }); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -30,44 +51,51 @@ class _HelpAndSupportState extends State { Container( decoration: const BoxDecoration( image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), fit: BoxFit.fill)), + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), ), SingleChildScrollView( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - sizedBoxHeight(20.h), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.faqscreen); - }, - child: rowTile( - imagePath: "assets/images/png/Vectorftt.png", - text: "FAQ", - ), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.faqscreen); + }, + child: rowTile( + imagePath: "assets/images/png/Vectorftt.png", + text: "FAQ", ), - commonDivider(), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.contactUs); - }, - child: rowTile( - imagePath: - "assets/images/png/fluent_person-support-20-regular.png", - text: "Contact us", - ), + ), + commonDivider(), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.contactUs); + }, + child: rowTile( + imagePath: + "assets/images/png/fluent_person-support-20-regular.png", + text: "Contact us", ), - commonDivider(), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.reportabug); - }, - child: rowTile( - imagePath: "assets/images/png/codicon_bug.png", - text: "Report a bug", - ), - ), - ])) + ), + accounTypeLogin == '1' + ? Column( + children: [ + commonDivider(), + GestureDetector( + onTap: () { + Get.toNamed(RouteName.reportabug); + }, + child: rowTile( + imagePath: "assets/images/png/codicon_bug.png", + text: "Report a bug", + ), + ), + ]) + : SizedBox(), + ], + )) ])); } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart b/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart index 0d18b33..8504040 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Settings/Settings.dart @@ -23,6 +23,25 @@ class Settings extends StatefulWidget { } class _SettingsState extends State { + String? accountTypeValue; + String? accounTypeLogin; + + @override + void initState() { + setValues(); + super.initState(); + } + + setValues() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + // Update state variables and trigger UI update with setState + setState(() { + accounTypeLogin = prefs.getString('accountTypefromLogin'); + print('account type login is $accounTypeLogin'); + // accountTypeValue = prefs.getString('accountTypeValue'); + // print('account type value is $accountTypeValue'); + }); + } Uploadata() async { utils.loader(); @@ -38,7 +57,7 @@ class _SettingsState extends State { await prefs.remove('phone'); await prefs.remove('accountTypefromLogin'); await prefs.remove('principal_xid'); - await prefs.remove('accountTypeValue'); + // await prefs.remove('accountTypeValue'); await prefs.clear(); @@ -52,7 +71,6 @@ class _SettingsState extends State { } } - @override Widget build(BuildContext context) { return Scaffold( @@ -91,16 +109,22 @@ class _SettingsState extends State { ), ), commonDivider(), - GestureDetector( - onTap: () { - Get.toNamed(RouteName.editProfile); - }, - child: rowTile( - imagePath: "assets/images/png/edit 1.png", - text: "Edit profile", - ), - ), - commonDivider(), + accounTypeLogin == '1' + ? Column( + children: [ + GestureDetector( + onTap: () { + Get.toNamed(RouteName.editProfile); + }, + child: rowTile( + imagePath: "assets/images/png/edit 1.png", + text: "Edit profile", + ), + ), + commonDivider(), + ], + ) + : SizedBox(), GestureDetector( onTap: () { Get.toNamed(RouteName.helpandsupport); @@ -132,6 +156,22 @@ class _SettingsState extends State { ), ), commonDivider(), + accounTypeLogin == '1' + ? SizedBox() + : Column( + children: [ + GestureDetector( + onTap: () { + Get.toNamed(RouteName.reportabug); + }, + child: rowTile( + imagePath: "assets/images/png/codicon_bug.png", + text: "Report a bug", + ), + ), + commonDivider(), + ], + ), GestureDetector( onTap: () { dialogwidget(); diff --git a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart index e54acb0..ca67740 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/TimeLine/AddTimeline.dart @@ -6,6 +6,7 @@ import 'package:get/get.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/timelineabilityModel.dart' as timelineabilist; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/gettimelineability.dart'; @@ -18,6 +19,7 @@ import 'package:regroup/Utils/Common/CustomTextformfield.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/resources/routes/route_name.dart'; import 'package:remove_emoji_input_formatter/remove_emoji_input_formatter.dart'; import 'package:intl/intl.dart'; import 'package:async/src/future_group.dart'; @@ -127,7 +129,6 @@ class _AddTimelineState extends State { }); // ); }); - } else { fetchABilitylist().then((value) { isloading = false.obs; @@ -155,7 +156,12 @@ class _AddTimelineState extends State { final data = await Profilepostmethod().postTimeline(updata); if (data.status == ResponseStatus.SUCCESS) { Get.back(); - Get.back(); + // Get.back(); + // await EditProfileApi().getEditProfileIndividual().then((value) { + // Get.back(); + // }); + Get.toNamed(RouteName.mainscreen, arguments: 4); + print("timeline done"); return utils.showToast(data.message); } else { @@ -182,7 +188,15 @@ class _AddTimelineState extends State { if (data.status == ResponseStatus.SUCCESS) { Get.back(); print("timeline done"); - return utils.showToast(data.message); + // await EditProfileApi().getEditProfileIndividual().then((value) { + // Get.back(); + // }); + + // utils.showToast(data.message); + // await Future.delayed( + // Duration(milliseconds: 500)); // Add a small delay if needed + // Get.toNamed(RouteName.mainscreen, arguments: 4); + Get.toNamed(RouteName.mainscreen, arguments: 4); } else { Get.back(); print("timeline not done"); @@ -223,577 +237,544 @@ class _AddTimelineState extends State { appBar: CommonAppbar( titleTxt: "Add timeline", ), - body: - Obx(() - // { - => - isloading.value - ? Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(), - ], - )) - : edited == true - ? Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage( - "assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - ListView(physics: ScrollPhysics(), children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: 16.w), - child: Column( + body: Obx(() + // { + => + isloading.value + ? Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + ], + )) + : edited == true + ? Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + ListView(physics: ScrollPhysics(), children: [ + Padding( + padding: + EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + text16400white("Club name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + clubNameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Role in the club"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + rollnameController, + texttype: TextInputType.text, + hintText: 'Enter role in club', + validator: (value) { + if (value!.isEmpty) { + return 'Enter role in club'; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Team name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + teamnameController, + texttype: TextInputType.text, + hintText: 'Enter team name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your team name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-ZS0-9 ]')), + ], + ), + sizedBoxHeight(25.h), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - sizedBoxHeight(20.h), - text16400white("Club name"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - clubNameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp('[a-zA-Z ]')) - ], - ), - sizedBoxHeight(25.h), - text16400white("Role in the club"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - rollnameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp('[a-zA-Z ]')) - ], - ), - sizedBoxHeight(25.h), - text16400white("Team name"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - teamnameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp( - '[a-zA-ZS0-9 ]')), - ], - ), - sizedBoxHeight(25.h), - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - text16400white( - "Start date "), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker( - context, - dateController), - child: AbsorbPointer( - child: - CustomTextFormField( - textEditingController: - dateController, - leadingIcon: - Container( + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16400white("Start date "), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController, + leadingIcon: Container( + height: 20.h, + width: 20.w, + child: Center( + child: Image.asset( + "assets/images/png/calender.png", height: 20.h, width: 20.w, - child: Center( - child: - Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, - ), - ), - ), - ), - ), - ) - ], - ), - ), - sizedBoxWidth(10.h), - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - text16400white( - "End date"), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker( - context, - dateController2), - child: AbsorbPointer( - child: - CustomTextFormField( - textEditingController: - dateController2, - leadingIcon: - Container( - height: 20.h, - width: 20.w, - child: Center( - child: - Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, - ), - ), ), ), ), ), - sizedBoxHeight(10.h), - Row( - children: [ - Obx(() { - return commonGlassContainer( - border: 1, - borderradius: 2, - height: 20.h, - width: 20.w, - opacity1: 0.24, - opacity2: 0.24, - customWidget: - Transform - .scale( - scale: 1.2, - child: Checkbox( - side: BorderSide( - color: Color( - 0xFF434A53)), - value: - isChecked - .value, - activeColor: - Colors - .transparent, - checkColor: - Colors - .white, - onChanged: - ((value) { - // isChecked.value = value!; - isChecked - .value = - value!; - if (isChecked - .value) { - // Set end date to today's date - dateController2 - .text = DateFormat( - 'yyyy-MM-dd') - .format( - DateTime.now()); - } else { - // Clear end date when checkbox is unchecked - dateController2 - .clear(); - } - }), - ), - ), - ); - }), - sizedBoxWidth(8.w), - text10400white( - "Present") - ], - ), - ], - ), - ) - ], - ), - text16400white("Ability"), - sizedBoxHeight(15.h), - // CustomDropDownCheckBoxTimeline( - // header: 'Select ability', - // title: '', - // listData: _abilitydrop, - // onItemSelected: getCatIdFromName, - // initiallySelected: abilitiesIds - // .map((id) => id.toString()) - // .toList(), - // ), - CustomDropDownCheckBoxTimeline( - header: 'Select ability', - title: '', - listData: _abilitydrop, - // _abilityMap.map((ability) => ability["name"]).toList(), - onItemSelected: getCatIdFromName, - // (selectedNames) { - // // Convert selected names back to IDs if needed - // List selectedIds = []; - // for (String name in selectedNames) { - // for (Map ability - // in _abilityMap) { - // if (ability["name"] == name) { - // selectedIds.add(ability["id"]); - // break; - // } - // } - // } - // // Use selectedIds as needed - // print(selectedIds); - // }, - initiallySelected: - seelctedNameList, // Pass initially selected names - ), - sizedBoxHeight(80.h), - Padding( - padding: EdgeInsets.symmetric( - horizontal: 20.w), - child: CustomButton( - text: "Add timeline", - onPressed: () { - if (clubNameController.text.isBlank! || - rollnameController - .text.isBlank! || - teamnameController - .text.isBlank! || - dateController - .text.isBlank! || - dateController2 - .text.isBlank! || - selectedabilityid - .isEmpty) { - utils.showToast( - 'Please fill all fields'); - } else { - print(selectedabilityid - .toString()); - - // EdituploadData(); - } - }, + ), + ) + ], ), ), - ]), - ) - ]) - ]) - : Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage( - "assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), - ListView(physics: ScrollPhysics(), children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: 16.w), - child: Column( + sizedBoxWidth(10.h), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16400white("End date"), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController2), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController2, + leadingIcon: Container( + height: 20.h, + width: 20.w, + child: Center( + child: Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ), + sizedBoxHeight(10.h), + Row( + children: [ + Obx(() { + return commonGlassContainer( + border: 1, + borderradius: 2, + height: 20.h, + width: 20.w, + opacity1: 0.24, + opacity2: 0.24, + customWidget: + Transform.scale( + scale: 1.2, + child: Checkbox( + side: BorderSide( + color: Color( + 0xFF434A53)), + value: isChecked + .value, + activeColor: Colors + .transparent, + checkColor: + Colors.white, + onChanged: + ((value) { + // isChecked.value = value!; + isChecked + .value = + value!; + if (isChecked + .value) { + // Set end date to today's date + dateController2 + .text = DateFormat( + 'yyyy-MM-dd') + .format(DateTime + .now()); + } else { + // Clear end date when checkbox is unchecked + dateController2 + .clear(); + } + }), + ), + ), + ); + }), + sizedBoxWidth(8.w), + text10400white("Present") + ], + ), + ], + ), + ) + ], + ), + text16400white("Ability"), + sizedBoxHeight(15.h), + // CustomDropDownCheckBoxTimeline( + // header: 'Select ability', + // title: '', + // listData: _abilitydrop, + // onItemSelected: getCatIdFromName, + // initiallySelected: abilitiesIds + // .map((id) => id.toString()) + // .toList(), + // ), + CustomDropDownCheckBoxTimeline( + header: 'Select ability', + title: '', + listData: _abilitydrop, + // _abilityMap.map((ability) => ability["name"]).toList(), + onItemSelected: getCatIdFromName, + // (selectedNames) { + // // Convert selected names back to IDs if needed + // List selectedIds = []; + // for (String name in selectedNames) { + // for (Map ability + // in _abilityMap) { + // if (ability["name"] == name) { + // selectedIds.add(ability["id"]); + // break; + // } + // } + // } + // // Use selectedIds as needed + // print(selectedIds); + // }, + initiallySelected: + seelctedNameList, // Pass initially selected names + ), + sizedBoxHeight(80.h), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w), + child: CustomButton( + text: "Add timeline", + onPressed: () { + if (clubNameController.text.isBlank! || + rollnameController + .text.isBlank! || + teamnameController + .text.isBlank! || + dateController + .text.isBlank! || + dateController2 + .text.isBlank! || + selectedabilityid.isEmpty) { + utils.showToast( + 'Please fill all fields'); + } else { + print(selectedabilityid + .toString()); + + EdituploadData(); + } + }, + ), + ), + ]), + ) + ]) + ]) + : Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + ListView(physics: ScrollPhysics(), children: [ + Padding( + padding: + EdgeInsets.symmetric(horizontal: 16.w), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + sizedBoxHeight(20.h), + text16400white("Club name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + clubNameController, + texttype: TextInputType.text, + hintText: 'Enter club name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your full name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Role in the club"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + rollnameController, + texttype: TextInputType.text, + hintText: 'Enter role in club', + validator: (value) { + if (value!.isEmpty) { + return 'Enter role in club'; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-Z ]')) + ], + ), + sizedBoxHeight(25.h), + text16400white("Team name"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: + teamnameController, + texttype: TextInputType.text, + hintText: 'Enter team name', + validator: (value) { + if (value!.isEmpty) { + return 'Enter your team name '; + } + return null; + }, + inputFormatters: [ + // LengthLimitingTextInputFormatter(20), + RemoveEmojiInputFormatter(), + FilteringTextInputFormatter.allow( + RegExp('[a-zA-ZS0-9 ]')), + ], + ), + sizedBoxHeight(25.h), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ - sizedBoxHeight(20.h), - text16400white("Club name"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - clubNameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp('[a-zA-Z ]')) - ], - ), - sizedBoxHeight(25.h), - text16400white("Role in the club"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - rollnameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp('[a-zA-Z ]')) - ], - ), - sizedBoxHeight(25.h), - text16400white("Team name"), - sizedBoxHeight(15.h), - CustomTextFormField( - textEditingController: - teamnameController, - texttype: TextInputType.text, - hintText: 'Enter club name', - validator: (value) { - if (value!.isEmpty) { - return 'Enter your full name '; - } - return null; - }, - inputFormatters: [ - // LengthLimitingTextInputFormatter(20), - RemoveEmojiInputFormatter(), - FilteringTextInputFormatter - .allow(RegExp( - '[a-zA-ZS0-9 ]')), - ], - ), - sizedBoxHeight(25.h), - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - text16400white( - "Start date "), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker( - context, - dateController), - child: AbsorbPointer( - child: - CustomTextFormField( - textEditingController: - dateController, - leadingIcon: - Container( + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16400white("Start date "), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController, + leadingIcon: Container( + height: 20.h, + width: 20.w, + child: Center( + child: Image.asset( + "assets/images/png/calender.png", height: 20.h, width: 20.w, - child: Center( - child: - Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, - ), - ), - ), - ), - ), - ) - ], - ), - ), - sizedBoxWidth(10.h), - Expanded( - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - text16400white( - "End date"), - sizedBoxHeight(10.h), - GestureDetector( - onTap: () => datePicker( - context, - dateController2), - child: AbsorbPointer( - child: - CustomTextFormField( - textEditingController: - dateController2, - leadingIcon: - Container( - height: 20.h, - width: 20.w, - child: Center( - child: - Image.asset( - "assets/images/png/calender.png", - height: 20.h, - width: 20.w, - ), - ), ), ), ), ), - sizedBoxHeight(10.h), - Row( - children: [ - Obx(() { - return commonGlassContainer( - border: 1, - borderradius: 2, - height: 20.h, - width: 20.w, - opacity1: 0.24, - opacity2: 0.24, - customWidget: - Transform - .scale( - scale: 1.2, - child: Checkbox( - side: BorderSide( - color: Color( - 0xFF434A53)), - value: - isChecked - .value, - activeColor: - Colors - .transparent, - checkColor: - Colors - .white, - onChanged: - ((value) { - // isChecked.value = value!; - isChecked - .value = - value!; - if (isChecked - .value) { - // Set end date to today's date - dateController2 - .text = DateFormat( - 'yyyy-MM-dd') - .format( - DateTime.now()); - } else { - // Clear end date when checkbox is unchecked - dateController2 - .clear(); - } - }), - ), - ), - ); - }), - sizedBoxWidth(8.w), - text10400white( - "Present") - ], - ), - ], - ), - ) - ], - ), - text16400white("Ability"), - sizedBoxHeight(15.h), - CustomDropDownChexkBox( - header: 'Select ability', - title: '', - listData: _abilitydrop, - onItemSelected: getCatIdFromName, - initiallySelected: [], // or pass initial values if needed - ), - sizedBoxHeight(80.h), - Padding( - padding: EdgeInsets.symmetric( - horizontal: 20.w), - child: CustomButton( - text: "Add timeline", - onPressed: () { - if (clubNameController.text.isBlank! || - rollnameController - .text.isBlank! || - teamnameController - .text.isBlank! || - dateController - .text.isBlank! || - dateController2 - .text.isBlank! || - selectedabilityid - .isEmpty) { - utils.showToast( - 'Please fill all fields'); - } else { - print(selectedabilityid - .toString()); - - UploadData(); - } - }, + ), + ) + ], ), ), - ]), - ) - ]) - ]) + sizedBoxWidth(10.h), + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + text16400white("End date"), + sizedBoxHeight(10.h), + GestureDetector( + onTap: () => datePicker( + context, + dateController2), + child: AbsorbPointer( + child: + CustomTextFormField( + textEditingController: + dateController2, + leadingIcon: Container( + height: 20.h, + width: 20.w, + child: Center( + child: Image.asset( + "assets/images/png/calender.png", + height: 20.h, + width: 20.w, + ), + ), + ), + ), + ), + ), + sizedBoxHeight(10.h), + Row( + children: [ + Obx(() { + return commonGlassContainer( + border: 1, + borderradius: 2, + height: 20.h, + width: 20.w, + opacity1: 0.24, + opacity2: 0.24, + customWidget: + Transform.scale( + scale: 1.2, + child: Checkbox( + side: BorderSide( + color: Color( + 0xFF434A53)), + value: isChecked + .value, + activeColor: Colors + .transparent, + checkColor: + Colors.white, + onChanged: + ((value) { + // isChecked.value = value!; + isChecked + .value = + value!; + if (isChecked + .value) { + // Set end date to today's date + dateController2 + .text = DateFormat( + 'yyyy-MM-dd') + .format(DateTime + .now()); + } else { + // Clear end date when checkbox is unchecked + dateController2 + .clear(); + } + }), + ), + ), + ); + }), + sizedBoxWidth(8.w), + text10400white("Present") + ], + ), + ], + ), + ) + ], + ), + text16400white("Ability"), + sizedBoxHeight(15.h), + CustomDropDownChexkBox( + header: 'Select ability', + title: '', + listData: _abilitydrop, + onItemSelected: getCatIdFromName, + initiallySelected: [], // or pass initial values if needed + ), + sizedBoxHeight(80.h), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w), + child: CustomButton( + text: "Add timeline", + onPressed: () { + if (clubNameController.text.isBlank! || + rollnameController + .text.isBlank! || + teamnameController + .text.isBlank! || + dateController + .text.isBlank! || + dateController2 + .text.isBlank! || + selectedabilityid.isEmpty) { + utils.showToast( + 'Please fill all fields'); + } else { + print(selectedabilityid + .toString()); - // } - )), + UploadData(); + } + }, + ), + ), + ]), + ) + ]) + ]) + + // } + )), ); } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart index e60ef28..15eb216 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profileGetmethod.dart @@ -5,6 +5,7 @@ import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/accountSessionModel.dart'; +import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/certificateModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/editTimelineModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/faqModel.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/Model/followersModel.dart'; @@ -20,6 +21,8 @@ FollowersModel? followersobj; FollowingModel? followingobj; GetEditTimelineModel? edittimelineobj; GetAccountSessionsModel? accountsessionobj; +CertificateuserModel? certificateobj; + class Profilegetmethod { @@ -107,4 +110,18 @@ class Profilegetmethod { } return response; } + + Future> getUserCertificates(updata) async { + final response = + await NetworkApiServices().getApi( + "${ApiUrls.getusercertificates}?user_id=$updata", + + ); + + if (response.status == ResponseStatus.SUCCESS) { + certificateobj = CertificateuserModel.fromJson(response.data); + log(certificateobj!.data.toString()); + } + return response; + } } diff --git a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart index 2e3e64d..0fc9289 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart @@ -6,16 +6,16 @@ import 'package:regroup/Common/api_urls.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/data/network/network_api.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:http/http.dart' as http; class Profilepostmethod { Profilepostmethod(); Dio dio = Dio(); - String basicAuth = 'Basic ' + + String basicAuth = 'Basic ' + base64.encode( utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); - Future> postContactus(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( @@ -38,7 +38,7 @@ class Profilepostmethod { return response; } - Future> postBlockuser(updata) async { + Future> postBlockuser(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -49,7 +49,7 @@ class Profilepostmethod { return response; } - Future> postunfollowuser(updata) async { + Future> postunfollowuser(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -60,7 +60,7 @@ class Profilepostmethod { return response; } - Future> postRemoveuser(updata) async { + Future> postRemoveuser(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -71,7 +71,7 @@ class Profilepostmethod { return response; } - Future> postChangepassword(updata) async { + Future> postChangepassword(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -82,7 +82,7 @@ class Profilepostmethod { return response; } - Future> postChangepassverifyotp(updata) async { + Future> postChangepassverifyotp(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -93,7 +93,7 @@ class Profilepostmethod { return response; } - Future> postTimeline(updata) async { + Future> postTimeline(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -104,7 +104,7 @@ class Profilepostmethod { return response; } - Future> postAccountvisibility(updata) async { + Future> postAccountvisibility(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -115,7 +115,7 @@ class Profilepostmethod { return response; } - Future> postDeleteaccount(updata) async { + Future> postDeleteaccount(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -126,19 +126,17 @@ class Profilepostmethod { return response; } - - Future> postLogoutaccount() async { + Future> postLogoutaccount() async { Response response; SharedPreferences prefs = await SharedPreferences.getInstance(); String? token = prefs.getString('access-token'); - try { + try { response = await dio.post( ApiUrls.postlogoutaccount, - options: - Options( - headers: {'authorization': basicAuth, 'access-token': token}, - ), + options: Options( + headers: {'authorization': basicAuth, 'access-token': token}, + ), ); log(response.toString()); } on Exception catch (e) { @@ -193,14 +191,13 @@ class Profilepostmethod { response.statusMessage!, ResponseStatus.FAILED); } } - } - Future> postEditTimeline(updata) async { + Future> postEditTimeline(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, - ApiUrls.posttimeline, + ApiUrls.postedittimeline, ); print("response is ${response.data}"); print("response message is ${response.message}"); @@ -218,7 +215,7 @@ class Profilepostmethod { return response; } - Future> postRemoveCertification(updata) async { + Future> postRemoveCertification(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -229,7 +226,7 @@ class Profilepostmethod { return response; } - Future> postCertification(updata) async { + Future> postCertification(updata) async { print("updata is $updata"); final response = await NetworkApiServices().postApi( updata, @@ -239,5 +236,39 @@ class Profilepostmethod { print("response message is ${response.message}"); return response; } - + +// Future guestFollowuser(int userId) async { +// print("followRecipe"); +// final apiUrl = ApiUrls.postunfollow; +// // final body = {"following_iam_principal_xid": userId}; +// Map updata = { +// "following_iam_principal_xid": userId, +// }; +// SharedPreferences prefs = await SharedPreferences.getInstance(); +// String? token = prefs.getString('access-token'); +// Response response; + +// try { +// response = await dio.post( +// apiUrl, +// data: updata, +// options: +// Options( +// headers: {'authorization': basicAuth, 'access-token': token}, +// ), +// ); +// log(response.toString()); +// if (response.statusCode == 200) { +// final jsonResponse = json.decode(response.data); +// print("resp from api ${jsonResponse["message"]}"); +// return jsonResponse["success"]; +// } else { +// // API call failed +// throw Exception('Failed to follow user'); +// } +// } catch (e) { +// // Error occurred while making the API call +// throw Exception('Error: $e'); +// } +// } } diff --git a/lib/Feed Module/sidemenu/Community/Group/view/Group.dart b/lib/Feed Module/sidemenu/Community/Group/view/Group.dart index 053cb1f..11ba615 100644 --- a/lib/Feed Module/sidemenu/Community/Group/view/Group.dart +++ b/lib/Feed Module/sidemenu/Community/Group/view/Group.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; +import 'package:regroup/Feed%20Module/sidemenu/view_model/getmethod.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; @@ -36,215 +39,521 @@ class _GroupState extends State { }, ]; + late Future myfuture; + int id = Get.arguments["id"]; + + @override + void initState() { + // TODO: implement initState + + myfuture = Sidegetmethod().getJoinedusergroups(id); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( - // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), - extendBody: true, - appBar: CommonAppbar( - titleTxt: "Groups", - ), - resizeToAvoidBottomInset: false, - body: Stack(children: [ - Container( - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/png/Ellipse 1496.png"), - fit: BoxFit.fill)), - ), Padding( - padding: EdgeInsets.symmetric(horizontal: 16), - child: SingleChildScrollView( - child: Column( - children: [ - Column( - children: List.generate(GroupData.length, (index) { - return groupCard( - imagepath: GroupData[index]["imagepath"] ?? '', - title: GroupData[index]["title"] ?? '', - ontap: () {}, - subtitle: GroupData[index]["subtitle"], - members: GroupData[index]["members"] ?? ''); - }), - ) - ], - ))) - ])); - } - - Widget groupCard({ - required String imagepath, - required String title, - required void Function()? ontap, - required String members, - required String subtitle, - }) { - return Padding( - padding: EdgeInsets.only(bottom: 25.h), - child: GestureDetector( - onTap: ontap, - child: commonGlassContainer( - border: 0.9, - width: double.infinity, - height: 162.h, - borderradius: 10.r, - customWidget: Padding( - padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 65.h, - width: 65.h, - decoration: BoxDecoration( - shape: BoxShape.circle, - // color: Colors.amber, - ), - child: - // Center( - // child: Image.asset(imagepath, fit: BoxFit.cover)), - - CircleAvatar( - backgroundImage: AssetImage( - imagepath, - ), - ), - ), - sizedBoxWidth(13.w), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - text18w700_FCFCFC(title), - sizedBoxHeight(10.h), - Row( - children: [ - Image.asset( - 'assets/images/png/community 1 (traced).png', - width: 18.w, - height: 18.h, - ), - sizedBoxWidth(4.w), - text14w400_FCFCFCblur(subtitle) - ], - ), - ], - ), - Spacer(), - PopupMenuButton( - surfaceTintColor: Color(0xFF222935), - constraints: BoxConstraints.tightFor(width: 200.w), - offset: Offset(0, 30), - color: Color(0xFF222935), - tooltip: "", - itemBuilder: (BuildContext context) => - [ - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.w), - child: Row( - children: [ - text14w400_FCFCFC("Mute community"), - Spacer(), - Image.asset( - "assets/images/png/Black (1).png", - height: 18.h, - width: 18.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.w), - child: Row( - children: [ - text14w400_FCFCFC("Hide post"), - Spacer(), - Image.asset( - "assets/images/png/mingcute_eye-close-line.png", - height: 20.h, - width: 20.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.w), - child: Row( - children: [ - text14w400_FCFCFC("Pin"), - Spacer(), - Image.asset( - "assets/images/png/f7_pin-fill (2).png", - height: 25.h, - width: 25.w, - ) - ], - ), - ), - ), - PopupMenuDivider(), - PopupMenuItem( - onTap: () {}, - child: Padding( - padding: - EdgeInsets.symmetric(horizontal: 8.w), - child: Row( - children: [ - text14w400_FCFCFC("Leave community"), - Spacer(), - Image.asset( - "assets/images/png/logout 1 (traced).png", - height: 18.h, - width: 18.w, - ) - ], - ), - ), - ), - ], - child: Image.asset( - "assets/images/png/Group 1000004071.png", - height: 13.h, - width: 3.w, - )), - ], + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + appBar: CommonAppbar( + titleTxt: "Groups", + ), + resizeToAvoidBottomInset: false, + body: FutureBuilder( + future: myfuture, + builder: (ctx, snapshot) { + if (snapshot.data == null) { + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: CircularProgressIndicator( + color: Color(0xFFC18948), ), - sizedBoxHeight(16.h), - commonDivider(), - sizedBoxHeight(10.h), - Row( - children: [ - stackContainers( - number: "+2", - containerImages: [ - "assets/images/png/cimg3.png", - "assets/images/png/cimg2.png", - "assets/images/png/cimg3.png", - "assets/images/png/cimg2.png", - ], - ), - sizedBoxWidth(95.w), - text12w400_FCFCFC_blur(members), - ], - ) - ], - ), - )), + ) + ], + ); + } + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + return Center( + child: Text( + '${snapshot.error} occured', + style: TextStyle(fontSize: 18.spMin), + ), + ); + } + } + return joinedgroupsobj!.data!.isEmpty + ? _buildNoDataBody(context) + : _buildBody(context); + }, ), ); } + + Widget _buildNoDataBody(context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], + ), + ); + } + + Widget _buildBody(context) { + return Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: SingleChildScrollView( + child: Column( + children: [ + ListView.builder( + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: joinedgroupsobj!.data!.length, + itemBuilder: (context, index) { + return Padding( + padding: EdgeInsets.only(bottom: 25.h), + child: GestureDetector( + onTap: () {}, + child: commonGlassContainer( + border: 0.9, + width: double.infinity, + height: 162.h, + borderradius: 10.r, + customWidget: Padding( + padding: EdgeInsets.symmetric( + horizontal: 16.w, vertical: 16.h), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 65.h, + width: 65.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + // color: Colors.amber, + ), + child: + // Center( + // child: Image.asset(imagepath, fit: BoxFit.cover)), + joinedgroupsobj! + .data![index] + .groupData! + .groupImage == + null || + joinedgroupsobj! + .data![index] + .groupData! + .groupImage! + .isEmpty + ? CircleAvatar( + backgroundImage: AssetImage( + 'assets/images/png/img45.png', + ), + ) + : CircleAvatar( + backgroundImage: + NetworkImage( + joinedgroupsobj! + .data![index] + .groupData! + .groupImage!), + )), + sizedBoxWidth(13.w), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + // Container( + // // width: 250.w, + // // color: Colors.red, + // width: double.infinity, + // child: + joinedgroupsobj!.data![index].groupData! + .title == + null || + joinedgroupsobj!.data![index] + .groupData!.title!.isEmpty + ? text18w700_FCFCFC('Regroup') + : SizedBox( + width: 200.w, + child: text18w700_FCFCFC( + joinedgroupsobj! + .data![index] + .groupData! + .title!), + ), + // ), + sizedBoxHeight(10.h), + joinedgroupsobj!.data![index] + .myJoinedCommunityDetails == + null || + joinedgroupsobj! + .data![index] + .myJoinedCommunityDetails! + .communityData! + .communityName! + .isEmpty + ? SizedBox() + : Row( + children: [ + Image.asset( + 'assets/images/png/community 1 (traced).png', + width: 18.w, + height: 18.h, + ), + sizedBoxWidth(4.w), + text14w400_FCFCFCblur( + joinedgroupsobj! + .data![index] + .myJoinedCommunityDetails! + .communityData! + .communityName!) + ], + ), + ], + ), + Spacer(), + PopupMenuButton( + surfaceTintColor: Color(0xFF222935), + constraints: BoxConstraints.tightFor( + width: 200.w), + offset: Offset(0, 30), + color: Color(0xFF222935), + tooltip: "", + itemBuilder: (BuildContext context) => + [ + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 8.w), + child: Row( + children: [ + text14w400_FCFCFC( + "Mute community"), + Spacer(), + Image.asset( + "assets/images/png/Black (1).png", + height: 18.h, + width: 18.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 8.w), + child: Row( + children: [ + text14w400_FCFCFC( + "Hide post"), + Spacer(), + Image.asset( + "assets/images/png/mingcute_eye-close-line.png", + height: 20.h, + width: 20.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 8.w), + child: Row( + children: [ + text14w400_FCFCFC("Pin"), + Spacer(), + Image.asset( + "assets/images/png/f7_pin-fill (2).png", + height: 25.h, + width: 25.w, + ) + ], + ), + ), + ), + PopupMenuDivider(), + PopupMenuItem( + onTap: () {}, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 8.w), + child: Row( + children: [ + text14w400_FCFCFC( + "Leave community"), + Spacer(), + Image.asset( + "assets/images/png/logout 1 (traced).png", + height: 18.h, + width: 18.w, + ) + ], + ), + ), + ), + ], + child: Image.asset( + "assets/images/png/Group 1000004071.png", + height: 13.h, + width: 3.w, + )), + ], + ), + sizedBoxHeight(16.h), + commonDivider(), + sizedBoxHeight(10.h), + Row( + children: [ + + stackContainersGroups( + number: joinedgroupsobj! + .data![index].membersCount + .toString(), + containerImages: joinedgroupsobj! + .data![index].membersProfilePhotos! + .map((photo) => photo.profilePhoto!) + .toList(), + ), + sizedBoxWidth(75.w), + joinedgroupsobj!.data![index] + .membersCount == + null || + joinedgroupsobj!.data![index] + .membersCount.isBlank! + ? SizedBox() + : text16w400_FCFCFC_blur( + '${joinedgroupsobj!.data![index].membersCount} members', + ), + ], + ) + ], + ), + )), + ), + ); + }, + ) + ], + ))) + ]); + } + + // Widget groupCard({ + // required String? imagepath, + // required String? title, + // required void Function()? ontap, + // required String? members, + // required String? subtitle, + // }) { + // return Padding( + // padding: EdgeInsets.only(bottom: 25.h), + // child: GestureDetector( + // onTap: ontap, + // child: commonGlassContainer( + // border: 0.9, + // width: double.infinity, + // height: 162.h, + // borderradius: 10.r, + // customWidget: Padding( + // padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + // child: Column( + // children: [ + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Container( + // height: 65.h, + // width: 65.h, + // decoration: BoxDecoration( + // shape: BoxShape.circle, + // // color: Colors.amber, + // ), + // child: + // // Center( + // // child: Image.asset(imagepath, fit: BoxFit.cover)), + // imagepath == null || imagepath.isEmpty + // ? + // CircleAvatar( + // backgroundImage: AssetImage( + // 'assets/images/png/img45.png', + // ), + // ) + // : + // CircleAvatar( + // backgroundImage: NetworkImage( + // imagepath + // ), + // ) + + // ), + // sizedBoxWidth(13.w), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // title == null || title.isEmpty + // ? + // text18w700_FCFCFC('Regroup') + // : + // text18w700_FCFCFC(title), + // sizedBoxHeight(10.h), + // Row( + // children: [ + // Image.asset( + // 'assets/images/png/community 1 (traced).png', + // width: 18.w, + // height: 18.h, + // ), + // sizedBoxWidth(4.w), + // text14w400_FCFCFCblur(subtitle) + // ], + // ), + // ], + // ), + // Spacer(), + // PopupMenuButton( + // surfaceTintColor: Color(0xFF222935), + // constraints: BoxConstraints.tightFor(width: 200.w), + // offset: Offset(0, 30), + // color: Color(0xFF222935), + // tooltip: "", + // itemBuilder: (BuildContext context) => + // [ + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric(horizontal: 8.w), + // child: Row( + // children: [ + // text14w400_FCFCFC("Mute community"), + // Spacer(), + // Image.asset( + // "assets/images/png/Black (1).png", + // height: 18.h, + // width: 18.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric(horizontal: 8.w), + // child: Row( + // children: [ + // text14w400_FCFCFC("Hide post"), + // Spacer(), + // Image.asset( + // "assets/images/png/mingcute_eye-close-line.png", + // height: 20.h, + // width: 20.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric(horizontal: 8.w), + // child: Row( + // children: [ + // text14w400_FCFCFC("Pin"), + // Spacer(), + // Image.asset( + // "assets/images/png/f7_pin-fill (2).png", + // height: 25.h, + // width: 25.w, + // ) + // ], + // ), + // ), + // ), + // PopupMenuDivider(), + // PopupMenuItem( + // onTap: () {}, + // child: Padding( + // padding: + // EdgeInsets.symmetric(horizontal: 8.w), + // child: Row( + // children: [ + // text14w400_FCFCFC("Leave community"), + // Spacer(), + // Image.asset( + // "assets/images/png/logout 1 (traced).png", + // height: 18.h, + // width: 18.w, + // ) + // ], + // ), + // ), + // ), + // ], + // child: Image.asset( + // "assets/images/png/Group 1000004071.png", + // height: 13.h, + // width: 3.w, + // )), + // ], + // ), + // sizedBoxHeight(16.h), + // commonDivider(), + // sizedBoxHeight(10.h), + // Row( + // children: [ + // stackContainers( + // number: "+2", + // containerImages: [ + // "assets/images/png/cimg3.png", + // "assets/images/png/cimg2.png", + // "assets/images/png/cimg3.png", + // "assets/images/png/cimg2.png", + // ], + // ), + // sizedBoxWidth(95.w), + // text12w400_FCFCFC_blur(members), + // ], + // ) + // ], + // ), + // )), + // ), + // ); + // } } diff --git a/lib/Feed Module/sidemenu/Model/joineGroupsModel.dart b/lib/Feed Module/sidemenu/Model/joineGroupsModel.dart new file mode 100644 index 0000000..58c49a7 --- /dev/null +++ b/lib/Feed Module/sidemenu/Model/joineGroupsModel.dart @@ -0,0 +1,184 @@ +class GetmyJoinedGroupsModel { + String? status; + int? statusCode; + String? message; + List? data; + + GetmyJoinedGroupsModel( + {this.status, this.statusCode, this.message, this.data}); + + GetmyJoinedGroupsModel.fromJson(Map json) { + status = json['status']; + statusCode = json['status_code']; + message = json['message']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(new Data.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['status_code'] = this.statusCode; + data['message'] = this.message; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Data { + int? id; + int? iamPrincipalXid; + int? manageGroupXid; + MyJoinedCommunityDetails? myJoinedCommunityDetails; + int? membersCount; + List? membersProfilePhotos; + GroupData? groupData; + + Data( + {this.id, + this.iamPrincipalXid, + this.manageGroupXid, + this.myJoinedCommunityDetails, + this.membersCount, + this.membersProfilePhotos, + this.groupData}); + + Data.fromJson(Map json) { + id = json['id']; + iamPrincipalXid = json['iam_principal_xid']; + manageGroupXid = json['manage_group_xid']; + myJoinedCommunityDetails = json['my_joined_community_details'] != null + ? new MyJoinedCommunityDetails.fromJson( + json['my_joined_community_details']) + : null; + membersCount = json['membersCount']; + if (json['members_profile_photos'] != null) { + membersProfilePhotos = []; + json['members_profile_photos'].forEach((v) { + membersProfilePhotos!.add(new MembersProfilePhotos.fromJson(v)); + }); + } + groupData = json['group_data'] != null + ? new GroupData.fromJson(json['group_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['iam_principal_xid'] = this.iamPrincipalXid; + data['manage_group_xid'] = this.manageGroupXid; + if (this.myJoinedCommunityDetails != null) { + data['my_joined_community_details'] = + this.myJoinedCommunityDetails!.toJson(); + } + data['membersCount'] = this.membersCount; + if (this.membersProfilePhotos != null) { + data['members_profile_photos'] = + this.membersProfilePhotos!.map((v) => v.toJson()).toList(); + } + if (this.groupData != null) { + data['group_data'] = this.groupData!.toJson(); + } + return data; + } +} + +class MyJoinedCommunityDetails { + int? id; + int? manageGroupXid; + int? manageCommunityXid; + CommunityData? communityData; + + MyJoinedCommunityDetails( + {this.id, + this.manageGroupXid, + this.manageCommunityXid, + this.communityData}); + + MyJoinedCommunityDetails.fromJson(Map json) { + id = json['id']; + manageGroupXid = json['manage_group_xid']; + manageCommunityXid = json['manage_community_xid']; + communityData = json['community_data'] != null + ? new CommunityData.fromJson(json['community_data']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['manage_group_xid'] = this.manageGroupXid; + data['manage_community_xid'] = this.manageCommunityXid; + if (this.communityData != null) { + data['community_data'] = this.communityData!.toJson(); + } + return data; + } +} + +class CommunityData { + int? id; + String? communityName; + + CommunityData({this.id, this.communityName}); + + CommunityData.fromJson(Map json) { + id = json['id']; + communityName = json['community_name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['community_name'] = this.communityName; + return data; + } +} + +class MembersProfilePhotos { + int? id; + String? profilePhoto; + + MembersProfilePhotos({this.id, this.profilePhoto}); + + MembersProfilePhotos.fromJson(Map json) { + id = json['id']; + profilePhoto = json['profile_photo']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['profile_photo'] = this.profilePhoto; + return data; + } +} + +class GroupData { + int? id; + String? title; + String? groupImage; + + GroupData({this.id, this.title, this.groupImage}); + + GroupData.fromJson(Map json) { + id = json['id']; + title = json['title']; + groupImage = json['group_image']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['group_image'] = this.groupImage; + return data; + } +} diff --git a/lib/Feed Module/sidemenu/view_model/getmethod.dart b/lib/Feed Module/sidemenu/view_model/getmethod.dart new file mode 100644 index 0000000..9b839b8 --- /dev/null +++ b/lib/Feed Module/sidemenu/view_model/getmethod.dart @@ -0,0 +1,26 @@ +import 'dart:developer'; + +import 'package:regroup/Common/api_urls.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:regroup/Feed%20Module/sidemenu/Model/joineGroupsModel.dart'; + +GetmyJoinedGroupsModel? joinedgroupsobj; + + +class Sidegetmethod { + + Future> getJoinedusergroups(updata) async { + final response = await NetworkApiServices().getApi( + "${ApiUrls.getmyjoinedgroups}?user_id=$updata", + // optionalpar: false + ); + if (response.status == ResponseStatus.SUCCESS) { + joinedgroupsobj = GetmyJoinedGroupsModel.fromJson(response.data); + log(joinedgroupsobj!.data.toString()); + } + return response; + } + + +} \ No newline at end of file diff --git a/lib/Feed Module/sidemenu/view_model/postmethod.dart b/lib/Feed Module/sidemenu/view_model/postmethod.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/Utils/texts.dart b/lib/Utils/texts.dart index 7d77341..9fd534b 100644 --- a/lib/Utils/texts.dart +++ b/lib/Utils/texts.dart @@ -584,6 +584,17 @@ Widget text12w400_FCFCFC_blur(String text) { ); } +Widget text16w400_FCFCFC_blur(String text) { + return Text( + text, + style: TextStyle( + fontSize: 16.sp, + color: Color(0xFFFCFCFC).withOpacity(0.8), + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400), + ); +} + Widget text10w400_FCFCFC_blur(String text) { return Text( text, diff --git a/lib/onboarding/Signup/view_model/getUserprofile.dart b/lib/onboarding/Signup/view_model/getUserprofile.dart index e847129..d7ba6b8 100644 --- a/lib/onboarding/Signup/view_model/getUserprofile.dart +++ b/lib/onboarding/Signup/view_model/getUserprofile.dart @@ -31,6 +31,8 @@ class Getuserdetails { await prefs.setString('username', getuserobj?.data?.userData?.userName ?? ""); await prefs.setString('email', getuserobj?.data?.userData?.emailAddress ?? ""); await prefs.setString('phone', getuserobj?.data?.userData?.phoneNumber ?? ""); + await prefs.setString('accountTypefromLogin', + getuserobj?.data?.userData?.principalTypeXid.toString() ?? ""); emailid = prefs.getString('email'); myusername = prefs.getString('username'); -- 2.34.1 From 435cdf0909ae7820bc80270a7c74dc76f4316985 Mon Sep 17 00:00:00 2001 From: cj201199 Date: Thu, 25 Jul 2024 15:41:58 +0530 Subject: [PATCH 09/21] some changes in profile tab --- .../EditProfile/View/BusEditProfile.dart | 46 ++++----- .../EditProfile/View/EditProfile.dart | 29 ++++-- .../EditProfile/View/ProfileTab.dart | 94 ++++++++++--------- .../View/Individual/ProfileTabIndGuest.dart | 24 ++--- .../ProfileTab/My Network/MyNetwork.dart | 28 +++--- lib/Utils/Common/CommonDropdown.dart | 20 ++-- 6 files changed, 129 insertions(+), 112 deletions(-) diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart index 20a07ed..b1bd745 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/BusEditProfile.dart @@ -61,20 +61,23 @@ class _BusEditProfileState extends State { super.initState(); } - //Founded on & bio data not there + //Founded on & bio , businessUsername data not there setValues() { if (isOnce) { busNameController.text = getEditProfileBus!.data!.businessName ?? ''; - busUserNameController.text = getEditProfileBus!.data!.businessName ?? ''; + busUserNameController.text = getEditProfileBus!.data!.businessName ?? 'victorygames _10'; ownerNameController.text = - getEditProfileBus!.data!.businessOwnerName ?? ''; + getEditProfileBus!.data!.businessOwnerName ?? 'James Bothman'; foundedonController.text = - getEditProfileBus!.data!.businessOwnerName ?? ''; - websiteLinkController.text = getEditProfileBus!.data!.websiteLink ?? ''; - locationController.text = getEditProfileBus!.data!.businessLocation ?? ''; + getEditProfileBus!.data!.businessType!.createdAt ?? '12-04-2024'; + websiteLinkController.text = + getEditProfileBus!.data!.websiteLink ?? 'victorygames _10'; + locationController.text = getEditProfileBus!.data!.businessLocation ?? + 'Elm street london, United Kingdom'; - bioController.text = getEditProfileBus!.data!.businessOwnerName ?? ''; + bioController.text = + getEditProfileBus!.data!.businessType!.description ?? ""; // _selectedgenderType = getEditProfileIndi!.data!.gender ?? ''; // _selectedsportType = getEditProfileIndi!.data!.interest!.join(', ') ?? ''; @@ -136,10 +139,10 @@ class _BusEditProfileState extends State { Get.snackbar( "Error!", data.data['message'], - duration: Duration(seconds: 2), + duration: const Duration(seconds: 2), colorText: Colors.white, backgroundColor: Colors.red, - margin: EdgeInsets.all(8), + margin: const EdgeInsets.all(8), snackStyle: SnackStyle.FLOATING, snackPosition: SnackPosition.BOTTOM, ); @@ -152,16 +155,16 @@ class _BusEditProfileState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, - appBar: CommonAppbar( + appBar: const CommonAppbar( titleTxt: "", ), body: FutureBuilder( future: myfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return ShimmerCommon(); + return const ShimmerCommon(); // Center( // child: CircularProgressIndicator( @@ -224,11 +227,11 @@ class _BusEditProfileState extends State { ).image, fit: BoxFit.cover, ), - shape: OvalBorder(), + shape: const OvalBorder(), ), ) : CircleAvatar( - backgroundImage: AssetImage( + backgroundImage: const AssetImage( "assets/images/png/Ellipse 37 (1).png", ), radius: 50.r, @@ -254,7 +257,7 @@ class _BusEditProfileState extends State { child: Container( height: 35.h, width: 35.w, - decoration: BoxDecoration( + decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFFD90B2E)), child: Center( @@ -307,7 +310,7 @@ class _BusEditProfileState extends State { ), ), ), - hintText: "victorygames _10", + hintText: "", ), sizedBoxHeight(20.h), text16400white("Owner name"), @@ -325,7 +328,7 @@ class _BusEditProfileState extends State { ), ), ), - hintText: "James Bothman", + hintText: "", ), sizedBoxHeight(20.h), text16400white("Founded on"), @@ -346,7 +349,7 @@ class _BusEditProfileState extends State { ), ), ), - hintText: "12-04-2024", + hintText: "", textEditingController: foundedonController, ), @@ -368,7 +371,7 @@ class _BusEditProfileState extends State { ), ), ), - hintText: "victorygames _10", + hintText: "", ), sizedBoxHeight(25.h), Row( @@ -396,15 +399,14 @@ class _BusEditProfileState extends State { ), ), ), - hintText: "Elm street london, United Kingdom", + hintText: "", ), sizedBoxHeight(20.h), text16400white("Bio"), sizedBoxHeight(16.h), CustomTextFormField2( textEditingController: bioController, - hintText: - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s. Lorem Ipsum has been the industry's standard", + hintText: "", maxlines: 3, ), sizedBoxHeight(60.h), diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/EditProfile.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/EditProfile.dart index d4568b9..4ab2574 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/EditProfile.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/EditProfile.dart @@ -104,6 +104,16 @@ class _EditProfileState extends State { _selectedSports = getEditProfileIndi!.data!.interest!.map((e) => e.name!).toList(); _selectedsportType = _selectedSports.join(', '); + positionController.text = + getEditProfileIndi!.data!.position ?? 'Lorem lpsum'; + + trainingScoresController.text = + getEditProfileIndi!.data!.trainingScores ?? '50'; + + heightController.text = getEditProfileIndi!.data!.height ?? '6 feet'; + weightController.text = getEditProfileIndi!.data!.weight ?? '70kg'; + battingAvgController.text = + getEditProfileIndi!.data!.battingAverage ?? '372'; isOnce = false; setState(() {}); @@ -159,10 +169,10 @@ class _EditProfileState extends State { Get.snackbar( "Success!", 'success!', - duration: Duration(seconds: 2), + duration: const Duration(seconds: 2), colorText: Colors.white, backgroundColor: Colors.green, - margin: EdgeInsets.all(8), + margin: const EdgeInsets.all(8), snackStyle: SnackStyle.FLOATING, snackPosition: SnackPosition.BOTTOM, ); @@ -175,10 +185,10 @@ class _EditProfileState extends State { Get.snackbar( "Error!", data.data['message'], - duration: Duration(seconds: 2), + duration: const Duration(seconds: 2), colorText: Colors.white, backgroundColor: Colors.red, - margin: EdgeInsets.all(8), + margin: const EdgeInsets.all(8), snackStyle: SnackStyle.FLOATING, snackPosition: SnackPosition.BOTTOM, ); @@ -191,16 +201,16 @@ class _EditProfileState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, - appBar: CommonAppbar( + appBar: const CommonAppbar( titleTxt: "", ), body: FutureBuilder( future: myfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Center( + return const Center( child: CircularProgressIndicator( color: Colors.blue, ), @@ -247,7 +257,7 @@ class _EditProfileState extends State { ), ) : CircleAvatar( - backgroundImage: AssetImage( + backgroundImage: const AssetImage( "assets/images/png/cimg3.png", ), radius: 50.r, @@ -273,7 +283,7 @@ class _EditProfileState extends State { child: Container( height: 35.h, width: 35.w, - decoration: BoxDecoration( + decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFFD90B2E)), child: Center( @@ -357,6 +367,7 @@ class _EditProfileState extends State { text16400white("Gender"), sizedBoxHeight(16.h), CustomDropDownRadio( + initialSelectedValue: _selectedgenderType, header: _selectedgenderType ?? "Male", title: "", showOtherOption: true, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart index e3c1880..3ebbc70 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/EditProfile/View/ProfileTab.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_reaction_button/flutter_reaction_button.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -8,7 +7,6 @@ import 'package:regroup/Common/CommonGlassmorphism.dart'; import 'package:regroup/Common/CommonWidget.dart'; import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Common/controller/MainScreen.dart'; -import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/Model/GetEditProfileIndi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/EditProfile/ViewModel/EditProfileApi.dart'; import 'package:regroup/Feed%20Module/Main_Screens/ProfileTab/view_model/profilePostmethod.dart'; @@ -28,6 +26,8 @@ class ProfileTab extends StatefulWidget { State createState() => _ProfileTabState(); } +//location + class _ProfileTabState extends State { List cardtile = [ { @@ -194,7 +194,7 @@ class _ProfileTabState extends State { Widget build(BuildContext context) { return Scaffold( // key: _scaffoldKey1, - backgroundColor: Color(0xFF222935), + backgroundColor: const Color(0xFF222935), extendBody: true, // accountTypeValue == '1' || body: accounTypeLogin == '1' || accountTypeValue == '1' @@ -202,7 +202,7 @@ class _ProfileTabState extends State { future: individualfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return ShimmerCommon(); + return const ShimmerCommon(); // Center( // child: CircularProgressIndicator( @@ -248,7 +248,7 @@ class _ProfileTabState extends State { ), Positioned.fill( child: Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, @@ -315,8 +315,8 @@ class _ProfileTabState extends State { BorderRadius.circular( 41.r), border: Border.all( - color: - Color(0xFFD90B2E), + color: const Color( + 0xFFD90B2E), width: 0.84)), child: Row( mainAxisAlignment: @@ -350,7 +350,8 @@ class _ProfileTabState extends State { sizedBoxHeight(30.h), text18w700white("About"), sizedBoxHeight(10.h), - text14400white( + text14400white(getEditProfileIndi! + .data!.about ?? "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."), sizedBoxHeight(25.h), Row( @@ -371,6 +372,7 @@ class _ProfileTabState extends State { ), sizedBoxWidth(12.w), text14400whiteblur( + "Elm street london, United Kingdom"), ], ), @@ -414,7 +416,7 @@ class _ProfileTabState extends State { Row( children: [ text18w700white("Timeline"), - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed(RouteName.addtimeline, @@ -516,7 +518,7 @@ class _ProfileTabState extends State { child: Container( height: 11.h, width: 11.w, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors .white, shape: BoxShape @@ -528,7 +530,7 @@ class _ProfileTabState extends State { width: 1.w, height: 170.h, decoration: - BoxDecoration( + const BoxDecoration( color: Colors .white), ), @@ -574,7 +576,7 @@ class _ProfileTabState extends State { Row( children: [ getEditProfileIndi?.data?.profilePhoto == null || getEditProfileIndi!.data!.profilePhoto!.isEmpty - ? CircleAvatar(radius: 10.r, backgroundImage: AssetImage('assets/images/png/cimg1.png')) + ? CircleAvatar(radius: 10.r, backgroundImage: const AssetImage('assets/images/png/cimg1.png')) : CircleAvatar(radius: 10.r, backgroundImage: NetworkImage(getEditProfileIndi!.data!.profilePhoto!)), sizedBoxWidth( 8.w), @@ -600,7 +602,7 @@ class _ProfileTabState extends State { child: SizedBox( width: 20.w, height: 20.h, - child: Icon( + child: const Icon( Icons.delete, color: Colors.white, )), @@ -778,7 +780,7 @@ class _ProfileTabState extends State { children: [ text18w700white( "Certifications/Qualifications"), - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed( @@ -801,7 +803,7 @@ class _ProfileTabState extends State { scrollDirection: Axis.horizontal, // padding: // EdgeInsets.only(left: 16.w), - physics: ScrollPhysics(), + physics: const ScrollPhysics(), itemCount: getEditProfileIndi! .data!.certifications!.length, itemBuilder: (context, index) { @@ -915,7 +917,7 @@ class _ProfileTabState extends State { style: TextStyle( fontSize: 9.sp, fontWeight: FontWeight.w400, - color: Color(0xffFFFFFF).withOpacity(0.70), + color: const Color(0xffFFFFFF).withOpacity(0.70), fontFamily: 'Helvetica'), ) : Text( @@ -923,7 +925,7 @@ class _ProfileTabState extends State { style: TextStyle( fontSize: 9.sp, fontWeight: FontWeight.w400, - color: Color(0xffFFFFFF).withOpacity(0.70), + color: const Color(0xffFFFFFF).withOpacity(0.70), fontFamily: 'Helvetica'), ) ], @@ -946,7 +948,8 @@ class _ProfileTabState extends State { RemoveCertificationUploadata(); }); }, - child: Icon( + child: + const Icon( Icons .delete, color: Colors @@ -1041,7 +1044,7 @@ class _ProfileTabState extends State { sizedBoxHeight(20.h), Row( children: [ - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed(RouteName.settings); @@ -1078,7 +1081,7 @@ class _ProfileTabState extends State { future: businessfuture, builder: (ctx, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return ShimmerCommon(); + return const ShimmerCommon(); } if (snapshot.hasError) { @@ -1118,7 +1121,7 @@ class _ProfileTabState extends State { ), Positioned.fill( child: Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, @@ -1192,7 +1195,7 @@ class _ProfileTabState extends State { width: 1.0, ), boxShadow: [ - BoxShadow( + const BoxShadow( color: Color(0x66000000), offset: Offset(0, 4), @@ -1254,7 +1257,7 @@ class _ProfileTabState extends State { height: 40.h, width: 170.w, decoration: BoxDecoration( - color: Color(0xFFD90B2E), + color: const Color(0xFFD90B2E), borderRadius: BorderRadius.circular(30.r), ), @@ -1417,7 +1420,7 @@ class _ProfileTabState extends State { sizedBoxHeight(20.h), Row( children: [ - Spacer(), + const Spacer(), InkWell( onTap: () { Get.toNamed(RouteName.settings); @@ -1475,7 +1478,7 @@ class _ProfileTabState extends State { child: Container( height: 11.h, width: 11.w, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors.white, shape: BoxShape.circle)), ), Positioned( @@ -1483,7 +1486,7 @@ class _ProfileTabState extends State { child: Container( width: 1.w, height: 170.h, - decoration: BoxDecoration(color: Colors.white), + decoration: const BoxDecoration(color: Colors.white), ), ), ], @@ -1511,7 +1514,7 @@ class _ProfileTabState extends State { imagePath == null || imagePath.isEmpty ? CircleAvatar( radius: 10.r, - backgroundImage: AssetImage( + backgroundImage: const AssetImage( 'assets/images/png/cimg1.png')) : CircleAvatar( radius: 10.r, @@ -1588,7 +1591,7 @@ class _ProfileTabState extends State { child: text10400whiteblur(abilityName), ); } else { - return SizedBox(); + return const SizedBox(); } }, ), @@ -1652,7 +1655,7 @@ class _ProfileTabState extends State { sizedBoxWidth(7.w), Icon( Icons.circle, - color: Color(0xFFFCFCFC), + color: const Color(0xFFFCFCFC), size: 4.sp, ), sizedBoxWidth(6.w), @@ -1661,12 +1664,12 @@ class _ProfileTabState extends State { ) ], ), - Spacer(), + const Spacer(), PopupMenuButton( - surfaceTintColor: Color(0xFF222935), + surfaceTintColor: const Color(0xFF222935), constraints: BoxConstraints.tightFor(width: 176.w), - offset: Offset(0, 50), - color: Color(0xFF222935), + offset: const Offset(0, 50), + color: const Color(0xFF222935), tooltip: "", itemBuilder: (BuildContext context) => [ PopupMenuItem( @@ -1684,7 +1687,7 @@ class _ProfileTabState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/Vector (5).png", height: 15.h, @@ -1694,7 +1697,7 @@ class _ProfileTabState extends State { ), ), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( onTap: () {}, child: Padding( @@ -1710,7 +1713,7 @@ class _ProfileTabState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/share.png", height: 20.h, @@ -1720,7 +1723,7 @@ class _ProfileTabState extends State { ), ), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( onTap: () {}, child: Padding( @@ -1736,7 +1739,7 @@ class _ProfileTabState extends State { fontFamily: "Nunito Sans", ), ), - Spacer(), + const Spacer(), Image.asset( "assets/images/png/f7_pin-fill (2).png", height: 25.h, @@ -1801,7 +1804,7 @@ class _ProfileTabState extends State { 'assets/images/png/heart 2.png', 'assets/images/png/party-popper 2.png' ]), - Spacer(), + const Spacer(), commonContainer( width: 30.w, height: 30.h, @@ -1884,11 +1887,12 @@ class _ProfileTabState extends State { boxRadius: 30, itemsSpacing: 8, itemScale: 0.4, - itemSize: Size(45, 45), - boxPadding: EdgeInsets.all(8), - boxAnimationDuration: Duration(milliseconds: 200), - itemAnimationDuration: Duration(milliseconds: 500), - hoverDuration: Duration(milliseconds: 700), + itemSize: const Size(45, 45), + boxPadding: const EdgeInsets.all(8), + boxAnimationDuration: const Duration(milliseconds: 200), + itemAnimationDuration: + const Duration(milliseconds: 500), + hoverDuration: const Duration(milliseconds: 700), // toggle: false, child: _buildReactionsIcon(mainImage.value), @@ -1961,7 +1965,7 @@ class _ProfileTabState extends State { width: 100.w, height: 30.h, borderRadius: BorderRadius.circular(30.r), - borderColor: Color(0xFFD90B2E), + borderColor: const Color(0xFFD90B2E), borderwidth: 0.9, customWidget: Padding( padding: EdgeInsets.symmetric(horizontal: 10.w), diff --git a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart index 48aa32d..390f01e 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/Guest User/View/Individual/ProfileTabIndGuest.dart @@ -485,16 +485,16 @@ class _ProfileTabIndGuestState extends State { children: [ text18w700white("Timeline"), const Spacer(), - InkWell( - onTap: () { - Get.toNamed(RouteName.addtimeline); - }, - child: Image.asset( - "assets/images/png/iconamoon_edit-thin.png", - height: 20.h, - width: 20.w, - ), - ) + // InkWell( + // onTap: () { + // Get.toNamed(RouteName.addtimeline); + // }, + // child: Image.asset( + // "assets/images/png/iconamoon_edit-thin.png", + // height: 20.h, + // width: 20.w, + // ), + // ) ], ), sizedBoxHeight(20.h), @@ -609,8 +609,8 @@ class _ProfileTabIndGuestState extends State { ? Padding( padding: EdgeInsets.symmetric(vertical: 30.h), child: Center( - child: text18w700white( - "No groups Found")), + child: + text18w700white("No groups Found")), ) : SizedBox( height: 190.h, diff --git a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart index 923be90..e25a73c 100644 --- a/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart +++ b/lib/Feed Module/Main_Screens/ProfileTab/My Network/MyNetwork.dart @@ -465,21 +465,19 @@ class _FollowersTabState extends State { } Widget _buildNoDataBody(context) { - return Expanded( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - "No Data Found", - style: TextStyle( - color: Colors.white, - fontSize: 16.sp, - fontWeight: FontWeight.w600), - ) - ], - ), + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "No Data Found", + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ) + ], ), ); } diff --git a/lib/Utils/Common/CommonDropdown.dart b/lib/Utils/Common/CommonDropdown.dart index bea237a..18e8c47 100644 --- a/lib/Utils/Common/CommonDropdown.dart +++ b/lib/Utils/Common/CommonDropdown.dart @@ -507,6 +507,7 @@ class CustomDropDownRadio extends StatefulWidget { required this.onItemSelected, required this.leadingImage, this.showOtherOption = false, + this.initialSelectedValue = '', }) : super(key: key); final String header; @@ -515,6 +516,7 @@ class CustomDropDownRadio extends StatefulWidget { final Function(String) onItemSelected; final Widget? leadingImage; final bool showOtherOption; + final String initialSelectedValue; @override State createState() => _CustomDropDownRadioState(); @@ -522,9 +524,14 @@ class CustomDropDownRadio extends StatefulWidget { class _CustomDropDownRadioState extends State { RxBool onDropTap = false.obs; - RxString selectedValue = "".obs; - final TextEditingController _textController = - TextEditingController(); // Add a text controller + RxString selectedValue = ''.obs; + final TextEditingController _textController = TextEditingController(); + + @override + void initState() { + super.initState(); + selectedValue.value = widget.initialSelectedValue; + } List> _buildDropdownMenuItems() { List> items = @@ -570,7 +577,6 @@ class _CustomDropDownRadioState extends State { ), ], ), - // SizedBox(height: 5.h), if (index != widget.listData.length - 1) const Divider(thickness: 1, color: Color(0xFF434A53)), ], @@ -646,7 +652,7 @@ class _CustomDropDownRadioState extends State { ), ], ), - sizedBoxHeight(10.h), + SizedBox(height: 10.h), ], ), ), @@ -718,10 +724,8 @@ class _CustomDropDownRadioState extends State { ), if (onDropTap.value) Scrollbar( - // thumbVisibility: true, child: Container( width: double.infinity, - //height: widget.listData.length > 4 ? 250.h : null, decoration: BoxDecoration( color: const Color(0xFFFFFFFF).withOpacity(0.10), borderRadius: BorderRadius.vertical( @@ -738,8 +742,6 @@ class _CustomDropDownRadioState extends State { ), ), child: Column( - // shrinkWrap: true, - // reverse: true, children: _buildDropdownMenuItems(), ), ), -- 2.34.1 From 725d2cb01da46b0f651f7d3ff126257f5552bfc0 Mon Sep 17 00:00:00 2001 From: kishan06 Date: Fri, 26 Jul 2024 13:44:09 +0530 Subject: [PATCH 10/21] app icon updated --- android/app/src/main/AndroidManifest.xml | 2 +- .../main/res/mipmap-hdpi/launcher_icon.png | Bin 0 -> 4218 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 2121 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 0 -> 7245 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 0 -> 16221 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 0 -> 30094 bytes assets/images/jpg/AppLogo.jpg | Bin 0 -> 101742 bytes .../Icon-App-1024x1024@1x.png | Bin 10932 -> 478662 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 295 -> 613 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 406 -> 1628 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 450 -> 3064 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 282 -> 1018 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 462 -> 2927 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 704 -> 6053 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 406 -> 1628 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 586 -> 5160 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 862 -> 11197 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 2299 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 7744 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 2870 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 10014 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 862 -> 11197 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 1674 -> 25930 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 4218 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 16221 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 762 -> 4642 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 1226 -> 18159 bytes .../Icon-App-83.5x83.5@2x.png | Bin 1418 -> 22092 bytes pubspec.lock | 48 ++++++++++++++++++ pubspec.yaml | 15 ++++-- 30 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png create mode 100644 assets/images/jpg/AppLogo.jpg create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 30a4ef8..14c5617 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -19,7 +19,7 @@ android:label="ReGroup" android:requestLegacyExternalStorage="true" android:name="${applicationName}" - android:icon="@mipmap/ic_launcher"> + android:icon="@mipmap/launcher_icon"> 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 bTi5>s00Yrky!Pvs00000NkvXXu0mjfh4(53 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c616eafa996a82e45ad983039c952adb328da56 GIT binary patch literal 16221 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 Hu0mjfWu|?z literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..798afd131856c651b7d6891a35fd9d65f8e9f034 GIT binary patch literal 30094 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�qmwBr!x^4KEhA&O@co*Vtuk^>@68u!!O7%;9HO@ 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 B$(;ZI literal 0 HcmV?d00001 diff --git a/assets/images/jpg/AppLogo.jpg b/assets/images/jpg/AppLogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb49aef6e0e560d46831da75c73246e88cf222dd GIT binary patch literal 101742 zcmbrmeOOah7CsuqiaHAQs|6%vC{C$uts=G(AW4-O5w*mRwzhr{Ev-~*ffx`-OpX={ zZ3h#SQPe`BqZq7}XjMKG2#O^*C}9jWYS5qo4}~iJ4G3p zd$O`~#JLB)&&&Ve$Da-t{p-ll;$z28{QLBova{;)bHDs{`O4MGs_L3+HydyL-lS{3 z{hxb=_CM|$A3S{Y^qHlr`#IiY?X?d&oW#(u%T1znje~Xm@1L=S{XftIaZO_y81)uI%=kMHaApV`i#q)YKuYa1c?LE4D2uaj$9M;S$8QvW6(syA>7Q}#{Ka}v?ckM5 zfvutw&xz+9>P?Y%B94E*E%vv{#wv1@ zk?$9+RBP8a@w{A{K{W&FDBTt zpTdqt>96_-c(#_?3tBFw*!G(hj^+THuI-C`Bh;s(jNH2G)`$68?745!Ei7-^IIqC& z-bB7wVDm2RjbaLoWN;T%_lk?E8)bA7Q|eH*Jh)}l$&$+LZj&Gpwu84X_6?Z{Dv zt$&o!`(mO*wiOc?kDmA@JzTrmADEs=6T>~dj>~{Gs+xKrQl2B24wbs|6!+*+ay_QkAEX51P&~ z2(7Bd2hIT9u0gRR4l@#7SzUTr72*ACdp1|a*H!p3**MwG##Y$AU$DTobh1Y}%HWDe zsF1Fpyw>Ve|c2h4BJ@ zqunDOajfa~Vo52R-*Qh4=Tf?gg*HDXe;rl})orKq48#~G%^uMy1=yzDXIR`mf z@8%gi?_O->UHE=@pl#^^dA&-(Qu4f8F0XlLoRTCk66H_o>mm#W5B?xyDE~b*?8eti zIR3sIzQJdd@kjrfZY|->f$yx$O<*+-5f-aCRyMJ$<&<#>H!k5tVvM81>Fg^=j!j{{ zvt)tIPHCUYtJe*BcpBS4ip4kpr$0D}>wP8eka5bU9R|{qSES4*^p#l1!(idq&tG7x zI(D3}c&HE+b?q)J=)I$m3qhOYt{b?A&&i9XzB{FLCI2!@DqTL)49B)_w$6&I<_|pR&@NPW zIQsQIDvg$(w3N7U=L7h%!h1_eYKwG47W^?pnBb4r>a~z})@k}0mcpQHa2Sl`1d7n& zV#0MWT$8q0#=P!q6$=ZTx6n~_E#XLG$Yi$H-~AjN=KLRSd#+hDe3@3si-aTJd#x1q zUiC+AtSrUmxu$Sfe=a7xJLq+qAj3lsbPkGH0-b6XMku1ncf+%7a5hPCtAax?7Nuok zBy2te`M1MNe%{_33pU~L{Ndc#0(3VBbUpnT;kW{fmqvz{LwzQy|L^G{x?;$8nt3$$;kJRdt{Yo6`a zI#<=otNN0RdEHM0xX|;?k>s%OmBsDnziC-NwPu^NnBzO5o<;0bT`rAtQpzgrlxMI;=j5h^wduY7dro#f91UChZlPM z^NLjk|Jk{*HmB$IBjuYXQvWr4<*WOptKJ!0wPE|SuA&rc&8L~Uch5aJP#SIDa4xU> z-ub_L&VFady3$80g@fzXrs_IA=?bZ_V|@=tlD=kL(l>ZF=!(kDp0nJ|Q4jQ^s=WEI z-Nt?A#KW#tkC#t+Ilp2~V|~aE73zxGnQ?P3&96K@bs%Zy(Zl|iI^{Dpzd!ur-Km?; zZTMzx+C#NyDxt8`mvQIPv=Iqb8?J-)Ikz_E|5W?cv-9rvncr+|-yCbW^Pd?3p+An_^zgIKO}g32(z6far{(>; z?UlMC2Wwxu_>URb_U?y!{xa{zwn2~9pZ}NKn>W^ zNg4b0e?C%mYGw(SV@)+w$}JE7_%qR7$C6vCX3KS7l--R!614XF==7fsz8$c0mSsxR z=J}J>H$F{wTH8(~mIkGN_iSQRpMf)x&GfhR#^6O;)cajfN|gIJQBXGDE6KEk8+$$s z(E^lHgmndHh5(FK9mi1ziN(HkrZL=(-XRMY5h0+!9n*pYn%TlW5YJXsb-5Y zECc-2XJHsCtaG)*Z6wmGSUdo^9!*kSC9&B*xz?wtqOvxR8dsWxRbU=b+3T z(}e|70c6(ir~DwRZn{_lnX~0_bux6N^f+C^sU#4 zuZAhXAC1mF&nP2NXJAenheOfGaP~5_elgCMY;t64)?$B8-5!s&r8*@#==m#n&Tf39^Mg22}Db#t!w#0X1X zo!sYL9-&Kodkz2qY#5;xp2@Z9Mj0B;HBm!zU(vnGX|RF&y%|t!ns>xzS~S73Sd}17 zxBgKXfKliHlDOfO*4K_Q@))QvE?A(`Z^1NocJOe6LR~NM^MCsDpI_a+W0dh%DzIM} zVXAJGZbNlxfsOP`O!0`;bi+dc|Ch}Wf(odKZ>zqS;E8a{7xETh>wk{} zRKz}oWqdnvhS*O%U{MEh>qclu9`J*=FJBUNF1BPKXBcPJmyR-m@)y`B7THVVvUl?` zp>mX=*qmav$|vregEnLP%lLCR3pc8FSxUa!87!|}JBWg5?E#g;MUaPzNClslRZOW^*QhVobu(ooN0Q8S0WKAsk-W0Y%ED@JpRWN!5?`u7Rip|T4qk5 z#h|H#eSty*KjG*jYzve{X%yk*>7%UjZCV>iT`w&>vsii3Vp7)ntMpo? z2TRmh*O+Zyap{^f3svjerD7RRu*(lWemi=^E#^Vo`lTg88q6ouARYJRxgeY{_(>hV31P@R?FF_-{WK{AHU_^6SN{s6X4}Y zgwAGNVC=_Z4|7+U^H(|Ee0c zMIF+Hif!QmJe;jdZs=3GqpU7g)12s2tEhk-ob=^vj)=;pw!HHJd~lGu20wMP-5c4& zJ1RZ+4@e9Lys@PP;X*IdaarZ3FWRjA{kqxn;q1C1Ir$jGdtj8!Y_on|HOgST z_GYU3=i_tac|yw7PKaeaFdp@7LX0=Ub&UXf7x> z&0oK|E>Fr^f3dpeqP9|b@7dRapQkUEzg^I?;lR$d=R!Wex$$wv)vF)z#ETA=1^#WW zVTE(yZx_D5kXSeQKcyRYuRC!1+Dlc!yf@qb-5>amD=$kG{l3)XQO3x2SK81+*I&x^ z{{5=lkYFFqKbsE)YxdrGsiqBac4^(2^>sr(PblJxMj4azKh8IgY-k*w8C#aT?m&~77{Ge8B;>SqbK+LAD>8C_glfgWmk`EpMEF(()q7~ zE?s%YAlP13RQrjk>%{O$Z?fcf)!ls0Y|~J#)@2yk;yQoxQ)2}+)%DunTq#d&e><`K zDrLT$p?Ws)!rv}O#`&p5&#)zp!;5Z?t1-mR|98&GRg?cg{W5SmH1DIE*_%H;c{DPn z@~aDDpRj4GKl$csy?uf8)U)Mba?jVTi^QLFzx&U|Ztm=s zuirkLp}q3;%J-ubfp33Q9XET!2YAcQ*2&S;t51*9_pkrWQ+>lyA0L3*Oq@%-(HVDT z$FRT2k~SFXO0{=2wX1=B*O4-*Z&Ks^ebkj+kZGy)Y1>53zWq=E=Gyl+>(x7bJl7zI zw(QY1M+J*|MK*F~k96XS=L#Fy5pp8SNY>S30~4$UW0+AMy{F$+)X?+McsD>yl4{`b z@3EQIR$pIV=HwxcBDHbxv|%Di^~WtMLDj2pPF;_`PM}KbeX=p%C7B^kF`FOA-rQ%? z>g&&wZicU;zps5{h>K5H!!o*UqYU3>_5|Dj1mDCF59@t{+gQNVxk|~tx!wdDVKdlU zInwXPZ>cq&)&5aCk|!j>f|)2H&n%)TCnYZw3r)rMO;*u64sm%lnya#&1Dk3Dmg^`ne)IMZeEFJC3c}>^MH4mX?7{LYbTU^xZn<|+q z@fTT7pyD?ev`KYmB)Q61-dFU1Y&;5p8lmQPIKwp6`t^p8YR@-IK=%NAZ~Ok5qIWsw z{j5i1(!@=JT4f}XD`sinX~wnJuTiSbMber;PW^XtkZuD&eDzQRRmuxl#68V{I(TXo z=?qAW7UwF~aIUlT+!9*54tnxbf{LhMiEP3MHQNtPX`0?zBo_}cIoJ36z8wMMD(r9& zKdDyAx!kXFlI;k{iywQjhB-yfVQ#J_QE2Rq>|X<1MGWc&t^H(&L(jr}3Q{z#5Mmm< zNX0FZ4EKZDyRhF_)%7+)VADr=Mea@~Z;k(6xo4_(;@jv4wvfwSYu2rW@+;*hc9aBD zuReS@CF$=uxMHn0KN=D5u~0s zxkOyhzQns3=tiWnW|&9SAG`4)hAu1a%LD0c0(X;sDwPn$Hz-U#Cb;D=J1q5LdMkaUmLCqAxS`pf2bRsL5$*mv;omPf8~Q_rQ3YUWlNYU9rb zwEP${PbT^?{hzNNZ7)AObc{dr1Go0ajaSkh8fq`xU-P5$^Jyu0O-<2*U+_eKGaR>l zM4lU|>kIGMyUl{l*z9U)lD%h_+Fq}<3x0&1o3Z8k>+c$)pP$b>*ZO-&@w@jPv%l!N zH23hTAnLap+bp>^o-QoB7qI#Lsj;seU3+@vV#~kp-TucethEw5@rge2jxD;veI5_2 zOg{1H(F@nAJzwqGvb>`X&$*wK+DCj_qDvZOs5E#-mc`tjq1-@dJiKSWhCHyaNlP2i z#3p4KzL^F`72*CVQdNFKFEg*#b8C7Qz2$E+mNi}sq~bM#_H+*W?l@PDbCfZEl+pT3 z;*aebvZ!Na;RS0#P-wbB`4u8-uD&w+MYNN1qyIx0H;eFcu^&{4Ff-N z$90=2f6Md0CZRjS!dvge!-}jQwr|3W!ZWaa#1JW~C2Z>+*3PShc(&cy{;~r%8LAA5 zif9!4N1BQ#kY}s%ciIq9xAapLidHlqeCHr{GL2M{OukVTVKiM*q{FkNEJ?_>5~_{X5IG=#h0 zHmPdZ?Jx4wO(JXv$-0Lz!NBsO0%iU2&VrCSjsyzr!%9f@!h6}VI7hNo%68&s{V$-e zX+xWM#%}b)z`IsUipFG(U_Ss@+^UqC5VKLktm(v}^M+$WSL_HQoNSARgZZ64kq3nr z@>=xEtl9%}y}V+zg^KFG4@zdmHqK?2JeOB!Gbr}b8&RvhFp*4Y14U*q{gu##{Y39~ zXxVj~7uWisrRu3du$Hbely+R1mRrNQhAAoU+jB->Th&MLFW)K%4_E0q(YUoujG!GY zM662Ux@u+qJEesXG(f)h4hJ&x1>IIuWNsGT zlkx>R^`MV3Qe~X+2t~%Wa3+XQ-=|c#{OZqea9l_&ZSyjb$<)L5QFH8V8J0t|Vv3v0 zZS-^zoERsrDMLq`Bq;1qsoBmxt4)q8c7i%2jR?O(YxIf!MhbKHtwR~vv}h6L&7>utYCuTWJCiT5j*CD*1a4ZS0TrL(TD`N^$jHhVh_~o3#QZgf|)i1h)3hB&x zPCuN|wm6A^L=I_Dt(LNV>oK1-W)0>uga}W*%tN>>?vz@w&d2( z?xuA6mY$$G<@s;l=!}?Jv@vY_#JF*dpU(dGFNSj;^{p%E^oGCw+O@2huW#H;Kk;Ny zL9zFmL2#(Yyx()l)FzR$`&x4}y>XN<_JT%jOE6 zm9H3+%=gX4!rc=2zCAa5fY%P%di^yYX*JiKe!j7+M4g>zW{%_SKlxhy9_lJp|8%nN zS*$fD{M>M?9hstOt zMOLpg5_JSx$d|8ZSKDpI0jF-z7a`!RyqPa~EQi&qcuupV!9Fjx!IO81XyQc}+c3ga z{v0v~z%vq%F>j_v;f(6*Z?>Ex&@Y{@y};8{?}!!M=2TmF`YQNu`NA$lM4k>G9r67*sykvCGjKZP&Ah`vD-Fkn|+D~!>l3Rm$KC7!!uog8r;tX>!8t{W zJHkFyw@a~i3hMUMUU2Pga_G9L5bZI&U?r3XjjbJ(RhLhK@7ahZDNi59Efv!Nq^+<_ z9-_biTWToC>I|Y|s)+DLLwoNsp^JJ0`C%;}Ti-jKg^^mlpi%h|_%-0+sEP7>65QH6 z$_P`e-ZNajy9cq=`{B?XIbCFAtya3d6P9?zm_P_MG+~qxMY5Lm8&J)Fw>7pAxYcFv zjdZ2-`h80)6X;tYh|3HTOS#$)`8HQFNGaI+RV|*XSF5zJ2958aC;HPg7p=%u9?V@%AiEyA(L5te3TK+TaTiC1N`o9{WEZ`RuMZyI$Rrwd83RE zN-@p-mJ01je@BzZg{itfTwtL5!OBc77;cT0#fIz~W$BbLlZqCzvcyuh>d=2->pas7L{^uO@Qi$c%F0y$0i|m75SR)^ zC-uoRTH@x&f~JL=PwAcs+xG-hzDznuO^LaYwtiBad+C z>}vCts15R5gIUejDY6mXb%laUDDw&6Y0hy(Khcq$mtyblBUpS#Khm>+Y5)wMf+ju8 zt;^{BOs1*&Mh2jb=YRG!i9@p>EZ_I5VXUPdRkIGcMV z+fOwE9Ok_?96au&B$Kt?rMPu$*NgApnbsO*wKc_8N`LcD^bb6jMnc|Q0E2xduf?N~ zZr0e4%#Nv5&+|V5dcNnpjk}TgrCs=nOT|&cbLUw!HE~6HRg3?G9_}6-t7UZ2P9!mNr^Ky1E9xVkY%Y5qUAw8 zq74I11|3!T176bOY+kWZy%BArR@0vPv|ZwW6Jg~uW4_xtr;4aSJ;4Mhf5$m?H<13Q zXNYNyG9s?mMc52%r&mHTzo*G=HiJ}Al@UFdZuZY9AJ3b#iKmV;ogy8It-b*^U{8ra z{H<1(L$TBhN#UlDrks9woK9A1xArLpf>X-kid8LXHWB>11L35sB*n*Y5@=Z?2EEaB zCXb4^c&DJCbGV<(0No(@VyqN2l2+F=ePVV1=ffsZEBGP^Bp~CY6N_x5>@!fcg_4me zcVXeMlDNtG#QKg*2)X;Zok!tBH1x|THqYQE`^*NFAkAS2tO2MUTeyf~N;*SI8L)+7 z`kM=HVoCK-7t8hc=;yzK2@Eq$=3JG%H3z?d3c<$41f7qD^|arhRzJOuHVXxft=!P( zQZy%*$hf$1_A~&z!aLMow+>l*qftx2NnL?bu`J#wuW8m}n+Z=1^BX82AZVr^4|yy! zg;%ZBhqe3Vwj&HYdUJ;CbQoc6VEFNuDyidR4VJd;;*6eX2bJUH&G<^Ig>&8qZ-oLE z)nOr(b-bkdQu~^2LksBzwh)xa3z;aZb6ItjzE3}|q8qCs-RXx%?&Nv&z z%(09|3k|Iau<5H-X9e=|PuldfZDCrfwiOvjJls7(jStpVn2k^NtUm+xmUN-SPDwsy ze?~JJg8Fp{yDQV8*5FMsxLNrJ^r0!(ryLAMNV*mua`qV=xQEbf9AmW?c+jY*;5c#( zYF3L?e>OE9-Wu|f?TlinqI9XFjODmh@COFY$l`ZM!yr}E9-&$-KFkr1$k+rJqT8sX zN~4xYck0%IY7XaVww>Ti9XieV{&rl=Z)98b6J#lWg;OEL`2i3j76+3z75`4W zwT;8ms|oAb8!nt#6GiB{!GddBV5`%fUl`?cINB@D>|$YR=0~s0HLJR`=U-gk+f?Kp z_ObRGd!z92WtYERCzWDlURhW|E5=F`OT0O{B%0cV9@vL9D)eThxS$LA9PS6;-~)@P zSX@F{l+f<+!c@l9Y5m@eL1dn}r-iE$qsighUE-9=n6bEm`r(l)A9HJ!+I@FXpyfZcOkQA`Apjl zk2b8$5A(lws*V5(*3z}mZl$tG=a^SG2T+dCrSTg|oFrIbpu-?5p1dhkN>TvH`t@Pe z%*e6dfeD^3R7MY5*gc#WQG1u)qMdZq&v97{Y6J6CT^OO~2{z_0=rtP&n(LK!bdD&qeH9M3$jFJ@?QnxT2fqPgAc#K!cl#R# zSoi3Dm4>b#MRK*#tUW7qr#PQO4W~gUZ>EdrYX>hNvp45`1i`f5sH`sm>sBLoHSq;a zC^hCE=<@Q=7ef<_w{naHnQXT?l06VvBwp|-A}PRRI5JoO@H(|1ancY=E+IIV?}M@H zsF)>ze(8XirDowJxvr8%nHq7V7RsNXR`Au~$l{Ys9dWW>?e^|L!kh%p5qB$}bd1@2 z#qNxt6}lu`4XrfZ(Rex(OdnwytJji1#1c9vBF=^vkxkpQE(EPGV{$MS=T-2MvPshZ z`VAKPtISO=Pjk>zimw+rI)kp8a{hm(2DOOHYc?xE_sSQ+o^ZyOZ3 zMkEN4V3tMyOk`4HcH1E<3_ew_`|l1{29l_)m@1LOtv8p_C4wKz;JEq?zP?p%9a5}> zwgaK{wljmvv0|1XT+Sexgr6h$b;EX7=1%tLPc`u3+AvkwD$D>6zL2Mkwy51vHkU(L z-TKW3Ffuz^-&qr#oAhElWOxs2GY;7Pl$Tm z7=&IJHiHcY{%Q$yrtbe*0;ldkcHe1~R<(dlYQ^*;|y;GMFg zc%j~{*d5F&8)b;Bj+wD&v}_1(7qw;D+PCjB4vY*@S6(M^PJGo;`GHK_TJqEQQN}^1 zgR0wmb*3`6m)#ms)GjnvX;;1ixqv+nCgvs^F5b57w^<6jY zdPaJ7my_tDc;7>do-Bpgxx+b4(rU1alHs^wGsaAn9EcMj%}`9Ub(mhA$Qg(M)8ZFc zdGn54T}}oS7|v=Qu`7>ELtfC5*e<7@lkRVUQHG?;$ZF9-%Xaxpy;f_q8Nhxoe~u{9 zCDe02pzoZB&5-PlFkN&;fyjoZ2yz|*h3Ie38fA=YPj=$mWBFm=$hYxZn33)Nn&d)G zjK#PRMc2kL4i^GL9KA%CLvJ|&Ndfa+E!(bNYUl-n;=GoZ2V-o|@YQMz5TJP}mq=NP z2WK6m2NDD{8-qy&j3uzT9lB?Lpcu62Y;i#Hj`sJ7%91f$i?J(ULd_|vAMK3!V3lFci|Kd*u%O#hF1RWu#-Nu!r80q4AO0e(aQh+N?o$IjLiu&4zS^V;@DG)BO7nP{WwWmtqvnri0 zOhEpFu8i2GgL9o8snA$2)hCLT?Ag=YFvYO*3cS0p120mj*B%yI+(RJO5IqavC#sT` zOQn|-XCs>lTJpBp)G!7bFMIMh+5z!wE8k6b{kHL1p!OMhMe>L~WhhW7o(7!P&>9P` zrO4o8rQWy<)PMe!pah$u(Z|*Y74!{G*EOCNl>btXLrc@Og|9od><9*81{F~4EEI4e+(;!?rAh zXP8=zSxvd1t;Zl6=Uj7A`I>H{@xrVYm37Ha%{La`qc@sSjDkw8qwF4!2kAZ)fI5S#NZ)2vduF5PEC|h&d)7 zECGD5Z1=x5g}ob%pRx?_j$-O=)IPyh@Y@v{M~}ZY>9LshNOGnDtLr7PLx#ZsI(xi3 zPTq0qn04Y2s7`e``1oLC;zCX#+vyM$*yqZ0f_=Xbh#Kg%V1+=(W_x)dQWB*&yfSQI zMtP+|w}nnmh`yIW{HI2{O&*QW*7hbSQ$}Jt9&RK_ypY2e>~j9vaUJPiLPWC$7prUW zrSPyy|D|TohcDSQQqm&hP+*iE*R40G13I&4@&+{!%6hQ?rkB~=Gm46+KIhQyt1u%$ zGSg2Z9NlwsrfR^$TOd0lwxifN`Us@Dvo!~rV0c9oE9vb`kg0#N6|Q$HmQSxoI_M^&^r;Jf=FRJPIdrZkLiga!6D*;Y^mAxHY~NVu_fFd;jM{52t+E6UwdDTPR?ZvE;|7jZ+{_sZYR7YMUv_ z$pLroJb*^mV(12*Y|sbX_JzD&iF!V0d>cI51o$z>`Y5R+3oH;6jg10o(mk=lQ6ee< zj^zDl74Si*mPvIH`M%d87o(u| z(`%!EqC7}ZL2HE>Mb)5r@w3q3)jmBCUXrWp)@{z}Z_4S@0|`bz*(S(K=*;BsbZ5D$ z_1+AuWdmVOgOSDb7$+~zW-eSF(O_}sCe(qMmYl%m)aiq>UPwmBprd!6CIY#$Bm~Q} zimJ90wRYkum;-{cvGzDnL2-)7ll$lJJjP0MC`TDxWAWfd!Q`46eyVjMTOZgPlfH;s znqNa3E8wO>b0nePX47k9{S)2Dikh+ogLZXl{8K{(uhHywpqC)3+IH|ZAL=8R(OWYc zVyQ0x6jp4DBIV}xkv;vUj!$7{$}S#o7!@B%Ir;S>*FNc2Fwf-mgS`gz=V?k&S6K=& zTiL_Br8G4{2bi=hMEOKnYgag0rI*lSkcuWQb~rky(`qnNRbq5@d!QL~(&EsA^A_U! z{(Lm_3Vn}z*|AfCRle=lpLl zCiDP-7htMw`Xt&Clbem(CXX^$s|z4R0)UaBOxqR7TTe-~(^bu|i%Iapj*IvBB9jL% z*qRJ`d-Uz#>%)}x0t%)e{$|A;DW{HenWXjX0GfcAbDijOI$0V+K^NWNrWYJ1GCJ8# zUOuyTY|MtbJ~h1DQXkPa5)vOv9Rsx4vkdSaGZMo}Z=~L4v&xUz%=a!sSBVFiq0t`Jr3(3VrT}CX(_&WUgpJ{(in*}hH!GEb$38zu)vN*O;F9!zp!k&)f6D*$4jQz0lGw99AM*H zRBl37K{7{@&hv4x_Kv_z>YB2yg(^yGR6aR|A2N?sH}vGeK$WBKL2@j3OkuyG=Du+~ zP?okGvDoU76i8A9EyEEzy|aTm%2<<4I4#W zjNMZwQyEnaQ|?}ehk;sF8Sh5wnK?t@R-g%FKF8ypb$4JNZm6KruiealckeGq)i zb*O2%(c72+H6{{1_U;G;k_^cyyhJ=iiv5ja9mDxo<|z3DS5@4eJP3eWz0Lrh4D`=6 z{LLVN4@hM3cJwi=W z^b$R&fk+rR?OmbyQeT0?+D~v@R#Yr2Rpoaq8i66#ooqCp#D9Pf&cA|X5pCqG64~+L zPFa9WKAFjZkiSfA2>YlGx`#6Cy^ca@gq6%iHJQF|RDDzI^on=Ow0RLUa&7v0u?ja= z@!P*F>NhZHFX3CBrq{Atbeo5(wE%C3p$tIIHus|A!OlahzZr`EMEUO z-7aw!J!B2@=YspW2|jKHkL>7DMtZ8>_gf9y^Yb+V#ybl_v`{XR#`K4w{9XrqQyniv ztZI2eOYbYM0+m&AKq4DsaaakAj-w;Evt8`Jm-QhZqbk#dM0wgBB*jws*eRQPYNitp z=s$#3xRLUO6+#QWy+k&_-pV@%!#eM&(R|HyUhyd7S1`@EO~?q4U=7tbv->?GvN-OO z+yON9{a{B_gKztnEJsf^uBw1-07nH{)bD0{cT32uzCM^(r!7RVz~V$OL`q09J^slJ zV`Q*iD{z4bhNn1w5k_4lJ0oKBSROA2J#<4t0}?2zLmf#MMV$?$xXT7E)TXZ^c?y1uv271C2lbQC z#lFEgC7F7Q;gDPWjBZ@?nhwIW;NWn${K2q?9z{Z54jWrASEO@vWyWTf??#Rknk<44 zoy2!@OJwW`hp|NZ^PxZ2;2ttd?~X!xZ;eOqU zKT!|KjFY}5o>x|{RV1?M5SkA~p?ODgKQZhTD?W^HmZu?a0qBvtKriUwp3ZgKk+7w^ z(ogE(!bCO9F|RM`fNBJ1?Vc9ypmMEkcHMI<4>^ZGQg(!~4DQ`gx~J~@X!moljo21# zXie~L?4++IAjJIi5jX~bkjOg%4xnc3r|NS4>>)JkZ2D)Br2lF!z&&(C;k@VP&7}CC zVuzZaq2#U2Q|1@jA75Y_2vj~6OR}u)5r_OLiaxqqaP$#~qQ+^>xM}|bjI67{4?Ve@ zHVEGVh4IXia8g2$LOJg!T!%udsmKSIk!g)j78l9u^W6%A$N78Q5l|RlB&pX^EWLrX z+HZg!hJhVv{88E1W?@FUMx@#OpuNl21@Rp=gHr077?at%a}!kx@sGY%c*bFsi>G45 zerxuoWJTrlEt3RhWSDi1hE5Z}ndV`Y1{3f*)n z76T>GxO_w=x%o#c5mGCW!$qiGAO;Wt3k*tpV7R$_cM8m2hXe2`tX4xvY4jIkMkK17 z2j(XGXp+2_kJ1J zEi9{2Lu$3F^mbOhunz$uMia;8Z9w13`;}BR>j=DfhYq8qpr5&q^R?YnFx?u9i&Qo8 zaL>q>_mM{E_DU@YffR^@HYp7Gy+@~{z4@ZdtDQU;P2yhtxfod~R&dDPpBY{$_0_mCb?Wu4C|7A{4*mWIrZm#rF4XN3 zxe+smy^KrninIDaaOO66uG4oPU=W)llppuVv`5+JQXfNFn(llv)9g`7Yl1WTJN%CP zT%6`&8ONL=Dqo#M)u!YUVUJMy=go9~N%VVa$Ykd;lvm(dQdefi;vRWvy!w>2J)`MQ z>w@gq#tyIGug)Tx^-im<8hIBmCw3tGl8%3eBnNY7G^uP;L=hfvz<*6Ck?iq(18!)4 z3%_TOstWoHL#-}Zt;L-jK;LohR-gQGPj3X=q448*Y2q_^ ze$`Z+^qP`Jo96A<~ybG&^z)I;EkU97}~X z+X=t?yb7u{v>NU=PS&w;N1sy4-RIDYk5Z^_2rwAd^HF1zmjhvMgBx897MAg@M}eRd z3NkS18r?+z^YuEzDJNZ)Dg#z9-PV#4NVGUTmgJ)4VGy609h;>~We?$l^Z*sj*-j@6 zQ>wF(5RScLPVF*@T`3h~?^%4xJz!76c?9q=frDDwr$=NP{we_N3aD#B9+M*urEl!V zwB~sZ-5MllJ<|_RaHYUy(RQm^$J#Hhumn6-XfViY9d6S5Hj11wko$A4S0!0Y5AaG~ z=5-M?;@pr2Rp9R^kHct5msqZ@&whS+H&t(ez$-FU$*@=n;j6W*L!_2w3V|vcxGzK( zNhYHSJNmNE*I?|Qmo1xVtiS|md!Y^}m~VpxvUc#rk}yNAH^%Nt(QvO$gBCyzb_0xy zg{sxc8mFFFV^P+;gw6{68!%uy%F9Ihv+>8n5qg?=2)Wo^!y5*|K8+FbVB?+ z7E6kF5!FwL({~1=q5;_N+E#WA!Y-B+`|;1|cWs5u6^LNQFfYQYPt6|~j`BzyH_Fot zB-mb?z7FLGU08_1Vq)@T<%go@60H*B&r~)=p3P%Y)LT5Co z8mmJ_8KtXIHqV4I!N4r&r;;lOV$F(R4Nu%2OxC_Mqg#Fh#UcL&fH>B z(r2IM5}uKFOjqKbiBZi2egZKyfH3mKVpV$1U(+SY&Q8_+Q(y%b7v2za?NflmE)?eD!jwXhM&70@B}qaRn0rnbb&*i5~bNIq{-2@Fdb=w zq31+Di3;@wK$ar#f#$%);9=5YE^m!=wbOPa92VTmi6VgHKu5(Up=WUCYtM#qBt?3T zL>8;$o}4Zp0H6Yx89s!YG)__$I1D$(U>j-=gmddXTT?u$B)JI1cqKuC2Kv?erIy-|TI zMe+$GCGzla-qL;#rD}Qb92CNqVt98(P$I`Q9N@GlTHGN!=U^bW(G_s;de$nVEG6Wg zfbd>EL?aN~GYgd^@=`!;jm>E9ybpDz5lSYs^Qw8cgQq_Pwk*V9cW>B2k_v{UF{?S~ z3J5)Fl9W982J>1-y-sa4hA0VSJmmmoBYKx)X`YKkigeB|=$6)C$BtdYR0-^IG@MGA zcQ5L1q~?lr-8Xoa4m>u4XnH%i3Sa~#ts!piVJh5{ufYsas0RxhVnxdJgg*UO)R2>3|b%=Xa-;?AbSaBgK1Wq_y zLs+pbHS#57p4yZi1I|B8t4E+`MnAs-1^`)gk>@aAUBg1_zabvL! z#=DN13-9GP^%dh--d)4Nif!}^Vjd3HfKOU@`90a(k}0%P0fILbxRDZIyJYAkKmzQ< zNFEN7@9ZR8VW^n43eJTVEZeyGzD5GpY^bB9=du(n>Y0+Hj}DiQ{ecoq@4^tNqwi&; z3oncrJ9wyc7n<;@$_VER-qbywF|_MyQW?U{tfbOQCSP~lQOJ{TF5Z(ib6sqYu2(X$ zou>U-fF!tpf2Knx0*QWk{gWf~$zy__UR8Ay{rWUbw++$^!gp#o>BXk&cSkgdUgRK7 zn>SN0la)AeH3uU*zx-jhrxsu=XoWu2j0f9wC-MD1-PIZa`T@%Td5upN7P*rZ4!zG{ z=QH%z2Nt|Di66XMsNcLbQ@^wz(^BFL{uJ>t5Wzt!nj-Welw0@I)&_IO(Wk)RWs0S2 zj|3mEzKk5}NdRGe6TAJAo4a4X)cfJ=X{Exlw(T#q2745@PV48p6BYA1aFk%aPuYRx zCyt}PXuI?pjMpppSYm_U{{pM`W<;0b7W^Hekzl(aR*WhQ+=5RtXlrUWI{M8o2su4$8yZN2F`ai*=G7>dH-ddvr4g>{AU1SkMuZdHm-X^(-l zxeDfH!F(n->UxMi5IXa(jO5Lb2niqXtHdQKij_bG)(&FE@}KKV#2H@BwGjVqFi}B1 ztu;=GnW~p*@7QxaE_NSn9wn&^W7mlww(9EaxkfqlXV!w-(->)OPxeTZ52!8V*ihDe z(+_+Oi7V^868~G7VI_Z3U`%jt&Y=g&T1u;q(ydNb!ni%+j)ga6T7D1DeLGE4Gh5U77OI`(&Px>S42?K5li4GBN)zMP1!KCGJ^Pn zotga}`=Q>5Kau=7L>l~g9I*V{FJ-5dT@XUZ;{*H?>UoLcJ^i{W%Y7gy5Zg{#3V22t zXP1P@OMtYhtDd^178oXDo=trnmAU@|!2L2weDi8FX_U{f=k7In7` z*;W9=8)#7~wznml-2@R1e?!9j4Bb&X&?Pc!!UyNFQq_iYfBFbBbzM2Ud~JAr%%1<* z!l3N{U;b#7k|9!VUDz>tPf72@!$O;@i^?}?`Tx1R+XKcllo#-!)dm8W10K`UfbJiQ z%mb95&=Q-`V58gG54N#iWb2daqQ#bgp<#Nq?f>HG+XI>2|Nos&ozyAm9=YsvIO!%y z<+|;ZQ&O>$ic`u?siX_J#@KdB(M4ORbYbfv(}i`BTUb&?%G6{P8iqBCZFVuUt>5$g zcD}!VCGXqo^}IZukH_N${K8mu%N{(iaj_#!&WsqKbHgs2kM(!qTG;lGNdKDl3Za&% zfFHVI6AVdl13Zp^wF>#@uAFl9FsP1fJ);mnW*Ha#EbVHwSlS>HGVaVqBibZ}Ic2#s zEvn8%CP*JW{;&;R78HL_Cm5)hA@j{NXW?}O--opPzzheIqDLANuww$6TSyw@mB<%s zzouCaQLpioQdERY6ujMIAH%b)qEvAs+K-{20~9H#Ss4Q9h^EJUGs!sHY!I!KlHy>k zPyO1V)%PQNXP&R#U0f8EA}AHWJOzN*Jhf#FhQPNW#o9QZK#3$kgri5+>f&@t9t5^y zcd1gfCF7>p-9gp4k4%7XJ*4+XZ$Mt@StvP5@1Y0tp$*rjoYw{t5qN} zawG{{JtfAvOH*{#w$<0fw0sodM4F^j3j+Uf9rdRXG2o?WQ7>qB#TiHjcOx?!i_#1b zSCO%LWM!s%lTRPHg6!^~|M@@%vb;IS7@Z9;ECd96qq50-FCh}8%0t1?UmHzb#%u)b zhKTVqQa0n@x!`lGWPHMoD$}DF+84I95=2XhEC)_keIo^uJia!ak{6FOk&Y!Z-FVdc z^f1YH&_wbqVdw)ZFv+;vC4(;?6T2YHm{f89B(*Ikn=hO_23WCy)$7QC8O-hpS#9>Q z8atL31F9Ylu%zHg%pBNjooVf(VZuz(=s#n4WojnYz+<@}XZ-k2xGZxt}8Q`&^OvFhI6UG<%et)O*O!PEtk^^uhfmkeM;wGK$= z#G8=6Avl{kDDcK2A%m>_zi1yrb82R)!1@f1Ee`K-`IF8mG!v6Rjp`EDw?L2X5!+Yw+vCcTrc=tf z0eC{xe*#>H&R%bZRsh4I!fon+YCNVn}s$PUs_8-|!Z#9?PW0 zKg6Ixg=Kj4B{_*=l5tQkG;eUw2*?p$yQoIdCoFz zPnyn@)S$DG=7<y4N-g1+ zV^D0PWLic}jM2-GAp4IWbV^PQfev%XO(wKIfX3ZxI?PRxE{aht`gUln$0!0sP^t}s zUA1@@4PCL$dGrt_4WDgmOevcH?;h$|CDL7HF(Zjbs0>z{4Wv?}(}iFEw3d9#V_5(A z8>I@J=j5$4R&hl#YaU=}s%8LWK>sXppPMHm>waFqJgr0eKrMVX$3sXg&}${o2xg-d&e zgcdVUIWWFL!)$PF*@je5hG65wc8GXbXJLk(1L!CpQE!L4i4>hi%X*aqi^xiDLx=AK zscaqr_@#JneoN?Mu~&=xL9pZeGR1-6spO6H6Kp>rQ)pC~1Rd@;UknY1_zENCHbQMa z68U%TGBBMmyMLB*hL0@{kEswtASlGuC2*%9h!q#xrg1Bkvta zxf2G(4lNqJf(NW|gj(K;!UEI`ORq4<3DCg)i6v zXSDGYVNm`&j`;6~C@#K7qtc0?2t^W$9N;V<)hdJx1J$tGJX!QBl8F#e#S04pwjy4I z$!=El#EMrzt+=scyaUWsLa4Yj0jKL7@{2@1Tx#pLwd5Gc^93p{0mdQ*ics$gvriv= zA@W)clu%y_185AXgl|g#RVwsHDrB`4Sj+w-VE6KKjzyFEk>b97kDJ7JjCxH4Ar+xl zKwAU#eP#lWKSIVcu}{Ix4c=b~vsDz612dd-BizfYK!6g6f^OtnSuwdd;Mvi6w37(N zUxbtcLTYb{OeWj%4khddA6%ZnwUE$X{m(_m;4sjw1)msP<)FsYg|Yo}{)rh2cJo=5 zcA$->z~5u7LfuQu_PQI$E)50(i$b1=P_|%UZU}b=NwoxWIJO_Az#I11GZm_V0myFk z_5Y@stCeP|Lcfr*lHTARob3V|j6+-d&RZ6OZy)Jpl!Z z(%^l-SiU|yBF*+QzQ>$x(lb>&0ZIX%`bc|&C#C?);pThBLWxtv1wf9+=Zwe%1|d>w zL#=_l%y8_8m+l{x7nS*H-aFU@saZ`?f@UKG`#O?sbu)q+r!ob4*P9;*_-x{?P)3#c z2zEXKxkIUvtmLtJK=?Z{M$17)2x2h`EvpJc_^#LlWgu!PO61e4`VW-^C@6ED?r`YL=AA0{MXY9_S`Ld zF<^)iTE}wnX>Mp$2EUr8*7N`uv$cup)OW}l>Egiv0V&0rk#Ugm8F0&tXwb{VH|VK6 zWjDOfTN}dNfUC&JP17PHFGP^h6RMPqjxI~MTjFg8jWo( znUaIzoEP5?OI3A=__J88E#oqR3BY4t<Q82Y}F!4L|X&FiDM z)-8Zt()G)0K{*L1Qj9P^31wlTeon|Ql8o0ZrQb-5GMV}v0x<=nv#sx(qFUdkq-Zkm zDRoAi9J&lN;KQyIw1m66!4_HWuGSlz>k|9WfHsfdE;faQ4(`7|IDq${YhRnl^M}pI z6!a%JSUhZptprm`pBzkMn>7VD(m(MY@)BVTqj%}2P6_+hg?q#hg9O_&r00Qp%YjAp zMxr?Oc`VYVdZ8=StFp17IMfK5rUYYh408{Ij56iCeZ>xPu2wzhVFcDBT975m zJ{jG(*cjSZ;U$R1V6ia*R5q>v9E0P~B{GF)(L;rYZ#(e~RSadbU{V(=#_Z~W;l$VS z9yMA^z}nle83f~{ zyoWsJ`|Lp$oE#hVZ8;(2tMM5)Bf#Pl1H?q#yvJP^^C^^JNMorWAnaN+af6Io>(5w!Ild0fYgffOqSM$r5xOwHR@C)G$P8O8gJqhaNjmr;Eno z*R-+AC6G9wS8?j^fc$+VOm_^pM#PP@NG5#G%`jH_9aKcX$m1qs0CkYcqyi93c7i41 z{NWceiOS)JNec<7V36oo>%t`5-7mE9AtBjsUN9d9BRmnU zW3e@&9*%Dgw*zTD72o>_y1zQ-zkn|_1*DkEnLR!dpx^}U8QF_YuD1eEn)(92YGABF*{0P$J%a=|v}THFgK>1HsExkM98wJ=cE4h!)d=ah1|o%B`UxaE zuD$YdHH;?Ad(*=JFD|RwfV`Ov2L=-czT=%jwCWe4oD5`dLf>AX>zSFMi(-b5!RZhp zw)8Z{37BzsdPMadHrD(mVE9PdI_Qcgh5!^o%jM!e!KfJVaDW>d)y0Y2O;mUhBD)IN zdFF5Rw*-+u(C;zb_y-ajkwSma#fxctB$F9^N&)Ty6dShC{4{-%!Ia}qGH35ZLcV?~ zY}&F9fAmMSsZ{-BY6k2?WQ29`lp6Mff0Y4uO}}`oUsD=^9?aH;HLHw?yvV=dwJdPK znu=SfS-i+M2=Ml7T8{b~uKErXb#Breq;NEhxP%DM@hy=aAsTLuhGA^SXx0yqh7JS@gLII~J25r-a_%LY6 zVtfS?Z;?ti)(0b&<1t(tXBw0)c;*=835h-stAt%pDoX}HiUF5cR=Ww)+eFYB%lh$N zZSYnh$4t)~jpua<+H9*_)ZGXH9qrvAjuKgHaAU(<8C%PO4j8E;EI_RU7&*XcMuUZm zky2%>9?=bh78O$bDFwY2G_Dw8eG(ddd4T?8eM*}8!^Bu!soNJA0h<+2-kUEIFm#rL zPTf3(v<=ztdRX}&CC!hjmyD3zHJw0@f-o&Wa$Po9feh=TT?D!?cV2G}FlSqUM22vw z?8#(M_-d0-%WNk{JX>ls$wAhBnVLJILTv$|=9BbH#<1a64UNhmJ{_=~Xdfa!k4 z%QlVQk~9v+-X4a8u}^iaE(+#Qcmaoc2*E7C!{z&Fn_>%JOo7o`!NvZJg4~pGF;XLS zs#r*mKzChZ-~31xkqc@|%o*4>sOP}+a%g$PC;laa*B9Be2ytG8Cn{)H*%+3SK?@}U z8VjN?f{);wXK>S(+i~!Xw5rE{2|;ZLK%7tg0W$b2S!=8TAwHt~3QHN1sVs&0_PEH# zhh>|KE^eqxD#Ps{ut|-fUNHg=XCs2S12QO~H>%*PGl~97bOsK72;X~X7H5r1n@W#w zq8j$q!q@Y54OQr$a(88^F)Z(NSPcj{7{nwuU;3LvwGX!U+|Y04iP3O}(lL%cWEM~Z zR;3Yna(GF;|*NCAoZLIVMDAr&GE0!p*qzvKHrN5A{?^BBj)1_Rp#sncgesA zm`b4ab7kGW`0scx%qx*Xh08}<%TuFMC^lLnnGRSONBS7;A2{m%`M7HCH_uVy-y#;8 zBZk`dcqy4hRNe@FXDTAM2V979O{!)3C+H0T+W_|;Nt%1gVHp5Nk7q+t(#F;$1TBOa z+tvOLm0r*}ih$>+7sk9@Bf7TL|0)Nwik);Wh#Re><`$Hrao zP8=8%=D#YbR(yg{2iz71VA;F6^~0M|lg$PFXv;EhgQYcw-3tO``nbnP&IDG$AQqP* z*BMYY5dcwoj5I23L`TXQrL#grkH+Fmxflj(5|vJI5qLq!X7qIcEdn9Lz;RLcp|;z3 zx)a(^H?LTb(E(BlSr&-TO#czRkDwhxs6(3R5{ZEV1ba4sL2e=z#dxg*ITu4d-T{+_ z^-#76@_hvSRc1yO@`&$hSxOnrpw&}zVG;vk2JcB43%xTB!-E=P=3heSX!GHnf0`uI z8cpRIv4tLbJcz-tP0uK$vL=W{u=~x&)+6ZNLtF%k9za~cX9cZgN9)8=8kWqd*TG(d zB5BF3JRpA9jzH0C5~Ek5tpIjKj83IeSxWepDlkL7h~RKMFsXC5{7y2!!4X;qq`C_U zC2UqU$79`W@WjmkR`2#lqmphErgT17j~wc*Q4Lr06&&5#hS@{qj8ooe#A#oZOBi-WGl-+#hfng=6D+yI4wq3ONBHFwEItMUy#fxYa~W8_c8K?e)CdG>s)vOpcQ6SwQ{B zcQz(yz_qJo2ptbLJ_0LTu*t|LMG1h)fbhXj@k#}5_8M!Tn??OMPaq0Jur!qeJP7%l zW2GZ|kzncMR2ClT52iJ7BCk+37&9Ox+7}45h~t8rrApJE!0V;+#%3U}0u*)*rZkSY zG(U;-4>H{VS_V|Ah9j1EF&OlK%3bU}1~f61b<1&;w&W(T;kl8W3lt`Zx!%5*YkKTN zF0jvp=$|a%8?AJMt|KC$-8brV+SPs!6nQT(R+(>-o7Pa%iL-l$D0B4-wHb;T>$2X& z$z4x+`F7tuTl?FiYbxxDkzap#TOGQw{&B>F^;_zD+37F4p1s<8@GqiD_srwCYU`!Q zp>~zLJl<(`zSZP2ua3taYEtj-JkVN!W-Z5DCyv%RvR^6yuOa_=7|ZJL1?{K?9n@@;OFgy{X`?dcZG z@?4MIYmPg8b)dX-PIFkYE4uspwWEQ>Rm;_Q%^*?QLyFaUx|I|ca9gWfhlk34!+IMh zo*1QmzWuE9g#PFIkH;-y={L(Ok5r1X?ze~E<2v;0bxz+WpC5I=&#}Lio>Q<5uDk65 zj0u;1S#9`eNeW66z3t|>y!Hx$2ZsjXWJ-ejfvjzY>&d|dKEGJHYJ+yk@fR4|c6Y8^ zZJef9Uw+&U_pUKgLoNRIFRzJjZ>qe{JRz0za<{_&XI?DaMBI6)v-j+_0m~C zOa>YP9%#4bFdK}lIwMYtRm5~{fB8lKmv*;eX4mV+ird~I_Rk5~F9SBbE4z7im0|UZ z#R!&A8dKxtI`zrn*K1!vQI1_ z*J#9YQ&YM>73cOId}D^JGSWwfC44VR)#DU82_288Qq^Uh7%8m^mwP`L;2O~7Rp-RP zfjc%MdKc(=cXNs$P$yDI$vQKKA*d1wSbR3Hl%ZSeg`cpGVLijztVs}iplw<^vu;I{ zR@6dLjQn$g>xK4PQ$pJytELI?ME}Zhs8YOS9`wWxHdIE!Fi&EJw7@DznM0Pw1g}uO z0Fw{w`LW{?>iu4j$cd&bcD@^SwDlHM9x6^Q+4VLN#rS|_dbIi2UuJd zNSR7QRE_=^Kqqj_1hckJ&3~8FMzG01dQ9xIIghW_mCx6<5^(Sczrgi`{p@vD! ziyzuYDL8`x+iy*)h(*Xky6>mN`J~X6Fh0vajl&KBLc8qwha;-nEE z=AvpZ9r%eeM!*%1$pYXRZuU-(tGl${&D{cuzajHoGo^I^2*LHC2S!G^c-vZjn*d%O z>KA6LKo(vWXi{}XvUUuJ-hHuMQ5V(Z-V<-EZig=vZb(Erz|2uNgb3_dCAwkUWwi5O z5R(Jo+Ni;lU*PtC-PN}R%|muW>sVFl%ocEh;<4=n0wwhDh^Hms zqV>aK{I1Xp#9jpe;EU!CaN-3?#S3MU&~8hQEIK~GVE&*?zX<~tj9q zVW8HFgyT>w#RmEEpCYJJlA=a5FlZe>$|xdhO)@@e_>`^#HnbpOQz`@X|sSYcF)K zp5B0^r^c4c_VSPR#mqYXrSI+;Rh6mVig8wlu74azWn>=Rv26R*aSi9|x{ht@*tMM$ zJO9IW``bOOm5=DJ-Gjf^_-cF#|7~+r*1r?i#3*S7BI zZJbKKrEPuLy<(?Xh)aVuhidiVLRa>l+yh0Ill{8!zFGE(-Wd?=*G2gE>vYA0 z@*^44*IN|7wL|fHz3D$(Wk4++ONzZV5GJzi&hB%s=R?kmgc)%``Q zAN~sG0Ct#upC7^d9R237KAL&s$Y}apvwc@5d$|4La=la*wW#~hZt~rM@;j5Lg0h_m-wxJIp{L` z;{`*pYy5HN8Ix$;U%Kp54>p)w%CPh`5uFP!EAIYs_`nT6(yIG2eeurZ+{j$e-d?-QwJw_{rgD$ zmauNu0n87R3HoFodH2`DoF~Jt4EXNVjFY~15b6n~u7^E?HPTT_7tO z4BBfGM3Db}`N^A;!S}`!mXH_BJSXvgU-v$is5jgpT~d?78;3J|@lO{QN^g7hUvo(< zc4*>Ui4Pd@O)Avix}|ki1a}HwN1ph)kXb{WYs4h5yM$+Nnf>~qa{HaH;nBO>9x{k+ z#m~<+?~u+rLVNh@$CWqEzr#@;?W(U7e0cw=`BlxfTYmRs#re2? z6q`1>xvl!JNudnM4hg$9j%!NGO;m{lZ7dSY?lurW_h)JXxs}scNMg*MQp5klF;yp_ya>wk`cC$|Fp-O&sH5u9(uROXPQr2IB^XH2xmy$=?IGPS;n%Xile zA!s0sJ42BeKVw2nj*2G+fvp!ZNdT|fNpAL2%}dqNrUd9*kk;SH32kHwY`+YkU7NJn-17%=ntWX@%U%3h%yeV{x1HdBBJ`C3V_)dHmsj_$EQ zFn_)3voX%|AELe5$G zGrhEj{CwC8CdkL`>LwDf2^g^u)6x@%Jc18&08vb0y%?^nP9=9i5sz@Q3&-1wXk`P< z)GZ_80u(6@f)`gGv3@FoT?&-e8W;;95dP6+%b6jje3+(5TM*#lw9~S$-kV72Vr!kw zI$qZqhMJRYndkd036oDA!8FICZ45+G1L2l0;8Qp;8=oC@&WL#LUWQ0Lk3dx5?&O47 z?~6|4f&K)ZmB@l49Uuuft8r=N^&*ZK>Fl6ozxcria!3iDClOY<8V|*V9j2+QT?;SpL?duwmPm-}a6$9N{Bo%zZU70+Zaf zQq~{Tg~%r>wlY#NJX#eMhcsgdG!AqGsQ^0yRM;}9OaR84dUwcX%S65dToupX-GavGlu0)#>dkZ4TAJ%eEWYwi*}~AABr%{xMn#u#W-p0k5Rvq)-JG zcgIpsz2ctch#;!EL1;%GeejjagtmGGJsA^8ddGpBk31WIdUSyx2c{vuHagNT01y$m zI>fU0w|A+z1^vUCoq<`QiTC=iUuc=LlX8OErKZ6%}QduPk)z zy3l)N{okUsuf|;xThs+yx)eIA{qBN0v#u1DsC*sUng{N#-Fhi>V);hD_0H+L?k;lO zm+4#5_QcmQcqgV=@O=$L$rTFxh2P%e?2Vs-Nc0nWmt!Rr45mEPyJFOp7MFC~Hg-#b zY{$Ax{Dk0Lzy90)ZRd`11u?@*Q(9VW-s-r~sYYzQ-#?3iS-hoiOUR1X??Tddz8{4W zt+6k6zNW@P73PzuetUn3+@lSKh$F&U?>;u9NPDP=~r!9p+z4C@uDO#CU*l+ZJ>Fy!xuC;2b2O-BaJgCQgZmvJ z{Xs{@?dsUrE)bXH1lm~!ZdYt)g*+_H>G=M9U9$5ziN)R7@9osq3(O~?6~z8jx?e6{BB(=)A`&fYmO`QqDYUJvi@ zy8rZNQ~M>>|I7<_eG>VeI5he0^G7Aafu(2m6_=mvU$ytb@0IVHPP_1To+^>7@J>F^F>+= z=UMrTKJml7dgFY(IP)-1)z7?+zlv$QVVoE&icGtB7(e5O$v&&Xt=&PVeg$&;y=3c_ z`ZDeLn>+qI+4;ldrDcI^l43%u{oMJnJ3=2TPCg6_yuK@BMN8zqQCC5)-shLf;>QgE z_ik@*y_BahbpJ5PCPXIv9U*+WDdc#X?^n-wGX5RKLCK?rCFO^NgjZa?+nQStJ{&YB zNHe!&=u60_uU|H6h6A&&luojF{p@40qSAGa(#QIdpVjNdOYZ!nN^Z#G`>l%QSA;*v zXKvH2st~;WlKa~g0I5AxnsGK*yg9fhLR*B44(1UkK77bV3hUu91HRLosX0^KbYv{3 zWB0%IeWS!y*s+9*f9uH%6p1J|HD=Iek0s&*MF(wOm zsYoB_4-@E$3p_jv$P0Y;hwVtwt%tbtDcnw~A4(b}#RwHB{X7u@=h~Tk3mN#FMM-#@ zA;=(54%D^G`aSq7c%FbIc#Ozgku<=Tz%YqPP{JW>ap+~lP#=@XwZ3pJ0+mNhrd&pg zc>!XHcHBBtF(BjKl8uB`mKsPSFq|tz7|BMPrv?&v2{OE&=lcS}z0g0JOr3`!JwWrD z;!w&Nf%cb=HVX*&J7Q)}8qJ~DKxgMJ8q*aws74_qt;th+F>e`({vC&`3{&gj&tW%c zOvkYVrP2)Gj`W{)_;i4*d;uxamINJ8Xq9)i3S{0J!b7D}n9GAXJ2?S#xae5V!IT4f z$>y*OfUA)94AFC``(3<};$T!e%q?;rt2j90$&;9rDmk9XDc3)z65V%=km?R=S^PW7> zJw14xH+fF=7)B?AA>J!IhQZ%OOsmrU6aAm3>r4&>;99w}6yi%Odj3bYx_@Psv@Hvq z+H%P+`uCtIo2|8TIl-hBk*Tac&vRGM5RR;XdH(L)E`eGjk*XiI84*4R`1V=$u9+9wVO;J6ShNevAV%DDx|AICIAa?@i6B)VGQP@q%^FqOM{jb{(% zxNvqEiG}~UGSG_%>_~2D=^8C$1Z^b1s+=`2GSjGaj1Kp2NY4qwaPaU4dXCEAF(qpZ z#cPfrdor}3MhWm#Tt{RcaCu%sg9gZ%h8O$iO!39*e^L?pV9o@rGrB!tCC%oZ9Jx z$*1!ATMG=I3TFjqS?)(Ct~@$)nX1V?X8&b3Gt29WYxVrH3#$g==P$u)0&` z;VCN)DRzF@K2LLb6=x~&H-j%b2UoCgT!w;2*PF>3Yma|ju01a@H%qX3S+VyDM`3V=U*e2KQ|8nUL>;RSnAk(TQhaxPVdDL5i<%03kNy%Blcg-) z8oxWF@m}uE;(|3Tg#okf6^a8kPA9srWPgs(Vb0-;G5Wcsn#0<}Rek5>PA@|iX_bXF zr+3E_J-fuUo#KVvHiX^$B7hkikN$d8f=MY{DSh^-b!W@_hCX)7KUyD~9gFt%Z+*GW zaQe{4>Zntf-GogK4nN$YEGu$&84%&NGtN0+XN+`x_M3q7_ZC#%%hUM+1#}Llvy@Xx zc$LVWFXx;~#>gYrmkVcv3(dVS`R&5Odv4paUg1{TF8$bD`Q@i8!y9h+9LP=zu03ou zajRsx-sw{FrY~FXoy{EGe%}`$kCWL?FI3)r*Y~-5J5T8`*qrO-MclaU@0(KUd{Pa_F;Rzpdn^Q+!yZ2 zj@|8F-wNhtyL7a>3a|HtJ6x_XNcJCy=ax&EF~J>P~Dc)VSu2tc~fv( zqvePGy1~9T{i`P|x#62vTDErLKMgCFWzKK^>CK~G|0U6W3nZ<){#^|+;ELGmAH$W{ z#v0}`;()8XZ$qBkX<(A#&dYnh3n-aUM5y8WLM z?=2JhJ0ES&(p=rVYLoi%yrW;+@FrkF;mI9C5-e!MlrW7bdUkyw&BmGx+2?@$Y?4mz8|$KNGlV z|ERk{VeNS(@Hy+3tBJ?&Y;rN{GJ@Jl_)&N5!wa~cQ7Awo(lDI zd77izG+gd2eT+QvT=jVA@uNQ%U)RrYePy2Zz|-ylA?}`J^&H#9ANDfh=#3ZjzZZPj zv9w2cNcwYe=>_GdqIs`BR6hDR|LnQvy~f$Wu}`v&U119S+BQf-n^|YKYHxRsvJ)wE zdDsB+U*m5Hle@E1k0gi51$C6U3fU>OV>kB|Wtw26aN0M)44=}b6LDtCy8Avy6ka>I zd#Bg=n8VBVl%HGV{p*PC()}$rSb;f`caf7`*KKP0;QLvXgiG5P-k&ST_|zKui-{iE z&y#@5)hxlyGJdWIWQjNvm*vU@nzPTI9Ovtg9z7EJJ~{69yZ2v*-b(g)QnFUC#lzd| zGV|Q`E^^Yk^KVvgi^5AX4zi`a=5VcSXLIO*#}ZSy7r6HeD$3IA@>1i<}?%q`$(?@cbQ1>apzh zx&8cS7nb!&{j1Z&rDf3%=MF6FUbJ^nU7_VY{*`yhMb|rgkMMnqO0YYZr+&<|k^WM~XwvIlrD z3^CWX8&mlG2`ca=a+1nWCbaH5nBnJ8@wK=rtTXh3aH1yk|EV(vv@vZ0MwLe>LOtJ% z^iq>U`9eA}x7>-8C-Vp(tRBJw4+f_O?<^3CVCx6*ysn(%qTkTDZgV&&z+UZR4td0i z94rv>1TdU|3x}mPB{Ud3pa6vH{OKUH0k4a_Ro^(FXZE|0c(ug)p)A_aE?QZVUcI^ZWDg{G`2igq&&%x0C)(Tbsxfojll z7$%u;gj7+?SA<2(DV$msfIC&MaR7P_j}C2`z{rWl_eKDrmd_3mvO*c0w}D3yOniBU znkUigrY3N05JnD4xH49Yn;H0}ww#P<(B%`>uoQI(;6f_Ii;G}l07?H8?O6M_Ul^aIm!y7W}?N6A5s(6CDq%bi`@5 zH6@0}zoj##*mBrFzJo#&&c;mP_*XrT6X6B-9=5?iYEL=tnu=>jW$lyIcI+#WEC_eKTk@y`dg#t>nW89Z}(4`YMbvcbIaDdej$YTukX|6 ze#v2Eoa?AQzrDYAB;F2l_U`GI{J16C;H8r%jbjbepe4-O6)amcHY5n4dUXk zz?RmdfqmgYigvO4s{`6J_i}Hu2}X7r=lR3|-jeXePl&TBlAVhK@UivLOPBea-X6>Ua-*bY)vu$7PZ2x4%rgcmtn*nEZTKyH)Zn%Lze$ZAA1}UH*%&OzxOMMtL<6)dChsrvIvIn4cVizr3?PYeDd>cy+Y zu5H)-+m<+*r@z|k{C7WtKYM4~e)eM0+R4T9t=3QGEdJO($eZL)nk>TX0teL~?>(^8 z653VcplIHeu8`0S(7wPl4g|Cg?TY>c{rU+6r8}zMrv?MJ0vK7LlWg4ad>{d<6+)o- zHi}^{x}XdTXqD#JzEbiiYeYhhKP3%397)s-z_z_65ft$F1^TBj;d|H)kqR;D25OKD zsNP~hsVST}KGrj}0^^*l#S@hVLbn;pY=oVtv+a^wX|8BRqbsx(=JWK^wdcE?{?~sy zDSVX`7B|oI^)9@O4K1k67Wfma>nVN8ld&+dhs+aU5`p3%)j(Jo~}!O}(|@d56EyZtWp^orM)`UsaZ}nN54U!lNwW zP}u?L`=E%`RewAE$w|oGv2MW?MM*yGQf7r8`<3B6+oXQsxK3i5QZr5)HX57k;<2E_ zG1*BGR6D0MTE9Yj!|Z0}uy@rZ%iy(wIlnr5th9RIU$6?h{OP9s&hv^c?X5nWDdzk{ ze{ka7JF7RBu4^u_^Rksb#UDPaKYxqeqnL5av+erScKP7*q7S<<4a}GLI%cz)Fg#QjhCMM z{ygUXV&Pdr@ z&mzvP0bU_6K;+z5@IU2&v3Re9Ck5q%*l-ZI!EoeSg2NCGpSHDT04QX`58IUGNX!H8 z3jo^jB7QZ>X9qEpBeRwrHIV5pHTt0KD)fWuX_;hj(b^oV=czygjWCtBoXSy3KnP}t z;j2@d?#G^Tpuzb*DLmkUDrJZlHjKKVbcl#f;FfB|$UJkg6+~YmGX`xj-|oR0U|!Gm zI^KuyZV~g@nNbn}qkUK`9O8j9gb=_Eu)?L>akU0=gP;`7{)CVWl5|UG@BOjvJ-QrV zD4~Psi|ra+5*2Zt(7{{)1zN}42;k25++`%8mDI!plY3;zr zL@@8QGmX)S4S-L0WP!^j+5wwO2S-yW$vRyOEs8e+1{pTT@?5ab#n#G^Fo{r(?k70t z?z1sRrLG@OKSEixEEuNCuGpajc<3oHGFl$W_oW6}Y>@Cq#(5<%jEu4|OeC#2*9ScH z+eyRrq1B#yIqWthi^Hu_0i|b~n7@!G{RD-H@fh41!0|lb5*p#WMs~7}Vf=_Nrl`AL z*#n_&7$kxq93#mbD-x|(=I>=r53b0dtMVK&bH=Nb78I2u>QZR1sza6&>B!n8y*cIulS zsP|M{OBt8n5;g{<^K~4mbWOS5T?$SYP~uE=&H&s6WId42$+eRj>ZtX`Tmv8#T7+_7 z=HL!52)?M8eit#3rT`NOIUZv3aa~TFNNyk@H4G>}E6zTrhYCw$(uZ}O46v~QQ)@dH zzMGrzs*aJPvb~DTJK(fks59Wa25LwZ_&_5Uq?iJYZW7;%;UnUfN}AE*dj2yNk6Z(% zs__K*IL_Fp9^Pc4nY)Cs0$0t16OLlk_o5M4=^7w`@StB|3f4wT(7;IpC=`P}O>dzm zp=A|$ZSBSn-v{Gt2wN*l_^J+E-K1sgNSQ2*_ND1fQ>%Sq(XyhV-)R=Vo}TA>HzV}I zrscC|TuXqCll_l|EFf#6^SS3)B>T*chVR+CpW(|e z+TX?cnbLKJ^y*n_x(Sxy6=d0fnZnBNS*4<{IAHP(`UHt<)Q*r~z0-U4-YZGe#|MX( z`$Tnb8o+ta;dHMIH~VPJ%1cOSqpW%5-mcuWiM27{?|Cy0rLWrf@G}3EUu2@gp>X{y z-J*@h4W+5k7W=f@10L>GXwR@hNUrP6uWT}#w4~_omAO7Pi?_87r7vnzuc(d%o2nhH zvGl3o^H^uR*4z)*EjWEUeE53F(}(?nD>_Q{-Eb1QGCN2|yF-n$4{VJOjDNo=DlRSx z=EqYamlhS|olD>EzJA*IoW7P&i~Qb2uKO+SJ~;X<^W)=SXfI5{s63fsGA7M1<>uq^=P zEHO*_iaf*Y#41kPzdWO|#x z`FGC|S|{jJK5<8MG!)iM&1#2GX=L2NCWyft4({}=^t5fG941g|Ua6_q%x|Vdt~EfI zNI~yk7JyIYbY5l3|MpAjT-SP9zC?3N5Qm?kH(zu#FTsafy1e~RwVig;yuC|;v46CA zuYS-?_-Vc6-qB@k1Ch0Jr1K8GRQi^r{h11Sl zoK%us5X?Qkr$8dmWNtc~6qO9r>kxu?P8ic0-}YU!VpVulVr8S^WAFLLt|PJit<@Pr>Xa41I7TP8kruVHn^ zFBf9iJ=q)2Qf8DW2D|B7mv9XMPcHZvd0Xycg?68}ZE6f}3$h(tXq@MC)M=&kc_IF< zXXTGLkIETuG;fA19ob9Sj{6fLjz$cyHuRO0m*(1^OW6Ns=A!AMjM*o~NfWa^9%8h9 zF1m7f6XxdDyz734u2&r1#{amoRbpJXA{sgyy{DM1L|sYdPm-pGwwNpVf&vShF}J|? zaMs!iQl|zAN#M(!7_+le&HKBP_V1`dnocX{hWJ9Lhd4b2j*Zf)^rNw0!Vj~3QzY&D z=|D4AiBq@|b<<)v@C%~%6kbSWin=rE#0brh03OHa?0N#zzvFonPsF(T!vrLsMY+(T zc@wCQi8nH^;42bktISL>$SW*wEcx<-;xECZ5g*)8CXXvI*@GxK%1F!+^K(>IU z&<2zwSaU4}dQB4K;^lzU;~P16X7XM{e_vS*hL)SbZC>R*cr2=oMLdLD!Fcs8u1OQPw?i>**;7UYrXW>(m+@0*Rg@IH!IL}z0a_3W^<>IT(l|aaA-F8-=tI!O7G^`S zl$x0+13OV6P$q|w6LUsv5c@x(pl3Z{S18LuRC>f%H40T8=tT2O*%3MENy9ugF=8E1 z-4P=7ZlJPNh-fT&WTT4vKja-N5RpZ$CoL!1lLW@p2)^sb^8@2U@ibehC1C*5oRIMl1SdNi5R9UgrIFz4T}Rl;Z=Zsc6O@n?U$t&ZXg<~>l>gX(sy6B){?NN) zv2?ybRd>h=)`tnS zM3_cBjPQVDk8ls6V&RtdGRg*0+R%LgIz;eHv#qWSrPr>Si)#3s>~sqO?wdn-)vOh~ zo<|=@QOxvJR(f_~{Ugnjt)4vJw)_yoHPt#Ht`7Rp;K?ZMSlUmZl82 zzWUr~?PTWZZhgmx{3jJNilyravsx8-!t#yMu7Ma$ z>3sU@TEqQAs_=JCngnc~U?ZQNvV^~eafo8Ra2zaL zBxAuLW-p_u4blOX)Hs{zjMUf6Mg?qO=4O$U_9ucVmZZ4oN5h6p1@6XV)G9|JK@M^d>ND~*YDF$lu68`;qiiT0G6;`ya`R#Y3-WB@7OgUuXtq_9!} z_?RxXMvbnsv?7*(QRdELxr-6^ouY?OE1rJLWJR(fsJ!Gc%D+@TEk~iF!XZKY(o&Qq zlD+5jBQR$g!`k4yc?IYDT+NV3p z7ju5`B0SigP4}&;y869TZhq#ORobZcE{~lF!8kURW7 z=-zD5jqkl8p?U?VGXp!8jEpb>`)j%n`V2P*<;*ZH4d`$h8JShGvtda@CiN3G`SH-L zKQQ$?{oEMMJbD+GR!BW!p60RbSb}RejXmdr;;{ddw0%1NLXObI0Gv!pR~-rS1P7 z7@|Y89eMLI(&c`aQoFuuMSOxCyi;>c*&(&Vt zV64*0XjopUS1kn|7>UdEAc=jUpjD65s9$)&DRl6x8xW%-b723hWQMqC)o@B~IU2Qe z22z)=8J3z&ZDt~eEM_CWizubVOaY%mAo!bxjCngkXNYN;IUuA<(|g2~V`m8&4!Phy zxed?~y(n&63xp9~AAmbuFVWFRNzvwn5Ik@jBH8L@7_Jv=;jBrs)ZqEnQ49mVX%9r> zVtCF*qs3aPj+^NjSKkxLZ(D`15s+i>5S6(dgTbK-^t8)U5h4~iv4f;YiDCABg5iEE z`USqjNfvaL%CN$uCra=TkqPx`!wt!GgZ=mrKol(9-9+>?$eV+dAOXKOX04Fz?@5Pa z9ve|F{zq>`dL2n)$5fyowN9TZW_*_N)WDoZD0ILA1lubs=H{3-Y=X)dnmz{M9>qUM zcd#5_ZlSZZVFhTD4DH&@YXe+jA3no2C$z+Uno#{1krVE@CZf+rT?i%7=ZRgn6-*r?F~1e*Di5H`jdIGPCD9iX!W3fRS$ z1Y1r%)%KG}f;b+dlEs2k%n&U3>4><9x<-IFID7lb7=&Mk9lqhxO2~wb*-rkfU5jk* z$z8fk&sF1-iQ41xu$nDry*4RkzV<4K6j#hSSMca=AONinpdU! zXg6NB4u8%s^58o6O>dTUn5))k*T|o~#Ei#TB+Tt{`1ku<^Fr{$*oO5Mhd+ zWzd~~^h0mx#q=fj#^+ojzPdx6nOPZG;rA@;0B0(`+eVmzS49zL0>k=>9HuTd8vTQQ zyug}Z_zAX1&1HPOJjm=XqH-o^X-xiQDy9l+(tnsVyiSIJ)yv?Q9H#DTF-I_E?AKrP zTP?%fEs5!|!COpTmXzxP+H`Fa_T0GPe+ibX4t> zKYy5W4}5@8X#I}L;;a`q+l-GZ;vdvk^lTiQ`%~`TbmyN>E;wece!?;Q1U*d66F5q0$HVCU zC}=t}p=sXoQhUQ_)|mGFNdr*4zEluPZfE_ReU>uq=Cj=4)pK@l-K0I;_hmuHzZKzg zPhH+?XZ2zuefINFt)u75YL30+FjN6^9&PmWH~Qn{RBvUQh^3$Iq7iDbN8=u7BWrEp zaO9gieXy^x@xQD(8|k&itaACa7^jqE@BKFuQjLRtZ0kVVxg`q6SD8n)wKx4s`kV4= zqx6}je?lVe^6g8JRPp&s0m>WaR&Ja3-C*9ZJ809#m3|vXeOim9229Y0!TcvJs=|OK zF`*@PwC%X_t{q=Lb-XtFc(-N75+7{Ut1W)B&TVN~kr7hrweQmHmfIisek=L?*CQk{ zGVLl-F1&chi)@ME+mzc>B@BE8q)`Tu1*+X9PYmm(svbEq2(^egWe>GxfG3IO(@Y9O z<=5a_2?iQk9fe%+-|=^mPGRvLm&eq-nHCsE)r&+Ta!oFm%EKDJ(Nbln9n@@bWhDtx#2ct<}M?T zIdj!DwsE|RYkcLU>fb+i9DJA@G;Ke1>%+&}?i|7W7MQv5 zP43~{?1e49P1x(#eeLP({X>KtFP12~hBtxIOq{5v%EP*UK1WR0+HIcZq%!+6G3x&@ z_2zL&reD~&O-*LG)Krs|N{yB6mgcwuQ&zSq*{s1VFVtY=f3ZA&ULPHU3DSHHw`Rf*;F}x z{r#^NslmQA>w6+cgqk>oIl+j*ZIoxu2wM$Rhfd}O;q|nt)B_s?-F1q*n zp}+BSYz@uL#=J9h-HC}^>%}RjQ=RA}23p=n$`#6qo1thO@QkFJh>HrLh$g z5f(J>Xb^mWF;kElUp6Ly_$as=O~fG*SX79yI?!F=Q-a;1n0N*sF@3vVZeY=&oS@Vv zJ(7)sssa>8i2Wq!_i)M7(gtjb0%+hs^a6X9grsOL2{CSMWdanBsGcN~r*xCPgz>O6 zV{{~}!BY;-yZ@CmN1JgKVN%nL%>9TVRlnSTNtCo>n^DIVrx61WnZ^fHBuv4#7xH42 z;nMnH_^k-H*mCP806;05S$7?jVHPx#Py;pmLYX=M32t51m`X|zolE|Xjw`b<7=x|z z>2!41)O#?zL!9>Ky-)e% zOsOxy#6KCtI=AP!Y=n{cJJO~0m_AA_MjfId+*cDOm9F*I$m?GqwF{c&r~z6CT2%;l#7} z+6S~{ZXMRm`a3V%1?d(hwcQ=o8TuiDo?2u?;WL?$~+P z&|3O@qQ7a3o7IuX)!#4+ROs?l+fi)KO1AJsi&G%cU%u^_a6ygLnN*L^zltb{w1aoN ze4^z+8yV-DYPy%M^QXV`@QPZZ@U!S&C8=*s#qchRX0;uvZE)D{{r;v#)iPKYRci>Y zLCnEaIuEU|IO6-KmVHAjcSk3=&_&+*(UnRR4tG8^fr{|`38_?#o|SsS5hNW zKgYyG++etg|C)Cz_E^ukpUX?X$@DVIFHJLdZV5Z~z}Dj1+ngs&Ww9h`ZsFdJw$5W+e$nYgNqJPx_x8A2)coBGw%g>?r&@iZ zins5MbPc-~%n#h}m#vPTb8APg^8u;EHHdP$BChSQ=men>@YhcQO>}hYt@Kw2@+*4p zo1`+srm!tWLAeLX&0jUSaOL1_kZlzcB7|+VCFQO$?gSR!Ukhx7lt)Nfz0q1WA}7k^ z-JuGZR%^R*LOZ9RG?EO*fSfcyyCuj+0sGg2W-lDDekW)LF;i`4ISLS`l7X0#q56q` zDtXn60_b1#-Hjat2Ypia1*H)8}mnQDT*% z`NL9kW)ZQwFD^iHOLsTu^>ZWOJUsANmDGa$v0Fnd0S7`T09OQ}jGq3|`RQk=GRLc$ z2?5ir>~PeqGpV{a&z`M3ZkhO(*p2!`Z>W&-ho{%q9-4kt zmXu(&2$$gfdr9f7p+Ypeb!*6ypdqwH0(D58ndc7RH4Cg^?)Raj1BTTj;(bq<+hd`_u14V(&q!1RGi1{E<+_{Eucn%`08}sua z4KB{mH*e)7IVN$nXANG&X;NMN14qD`(YcIZswqITNIRi8eR^^ojAgRgNjaufO99JA zFf!1{N{b%VrJ+a`B*_f~B^_NzuGE-Tl`{UvQ<{ryJ_j;6nCedCq^Z1mk|JUBsH)<$ zbO9)DA2!AGDJ3H;5K&heHGe9H~M+B1wxHq! zI2NtU6o5iCaZ*~`zyfVQLazFy^PA%Zdv00I`4SnQ1KkyHqA(#>YdCK4ENYOVA!t%f z35sjH`G6H-7i?Za%p>B9wZ;mbepnvJ1tl?xwROJtQ6jjGO;0n!c^i2X$Q@EldYr!r zT>PRPCL~<2WiD+9Z6N9+sDK>ULhwMqZI#l0F-@$tZwO@=+rbp|kC_gE>gZd`BtYEIL^8b5 z07)n10Da@_Y2qCd4VF^k-r$h56q1V_TSEA0(LU8UW3GjHiCkNzMk94<>mZ1!5HXQV z&oKT-69C%(bH9UWhK9I}pTO+uCCNt(nTL$1HRypxs!-4_5H!b#CvCP7y*c*74h^9b zY=rSahy}*`lyJ4DAGn2J5~MO{yLukzGzGsn1@!a*$2F}|SHT4f#&`?CVjiLpJU2%` z(BWgSBwBT}IwtIE{U|gR3@ij739Fks7&%Gt0?Y(tk)t&ad8JHy)Seh^`?mynRF=Xu z8odHBXUtliM)xtgL@_F2wuN?2zs_CEF{pjKygR<9HSlCB z_}*d-4|nmq=9gaDy7P(GbUR-Ir}GsWpY)#4wL!i&@=X3*A9k;0^}YkE?aIUMUJ8jV zuMOPwG%jkm5WDTOfA_10`e=*mHMK$Ov$hVh_U+G6w53#uH``1v84t${Kqfz`zWz&R zK#29ltDMZH!K7_}6#mB%idyFc)NEubXhTI4z1|ZWJ&>8wnqNA1jpV_W-yds|SO_z{ z=3O^dGJJgsV9Y14g`wxx{a6ng)tIGFBI6vOeQ~lqJAl(?#2GnyrMU#}ntEYD`fisB9@i z@Fgw*6Ar|l9ufQ)%axk1U$6tS0J_v(^-q$-vJ%?^vFrq1>4^Wq0*xG_|9 z!r%WBNm0$&4_%oxaYYWDi^odU_hMb_ibUf=`w4Uad;8XF$IfsTVHOW2KRV^;bIsYO z_eh`Bj*h>6@8DgT*1TIc@lxfh(uet@83!$ES6+ytbTFe|HLtbVy(3s!-|o7-w%htx z*LTmF2tS9+!l1^E_R8Cz|J)k+J@eI}?fb9p({*%p+{8MT{ZjMuug)bv=zRj0T~7Eg zhAJWs^}LY3c(2@gUUgQ!iaJ=mQM9fzi}vVwBxy@wQ4D>)3VnLZvNF=KHzk^HjZao> zdM&58vhswkRn;$^$7QyB4x#B?b5B-(J)Plh`|MQA7HZ0x3n}Brs)q8~FVcnrwp$S^ za+*)|b=^s+gB4TGIY8<;N2zB^m1#aSZ|fTqe>3wC)G-{>sg8*Wlky=)1kH3Xp&5Zz zSkEAw{Li8L!}I}}Bh~b~F&8vZ1LtGHji;)tf4U%U$D~k(0!4M_bIh%f3Cqh95i%3P zBjKc!E~JL}HP%UT^i`v7#|tv1$)v6fqH~3okTsNyw+n^Z#1Il+$Zu^Uc!{u0TWg6* zwb2`$i;D!mGGF}qa%|Y{U9KjhiP*8&-JiW|?d51*1@24ZV@nl1n(UB23 zVK%fCQe;{%QVHpn{Su8=6np}q(jyScf(Vt7IT8Sq;~9h20`{e7B_X}19vHebKHT#T zu}}tzirKn^>K3huF$e=a8)rzB$~#Ql9;73m(zPi~y-~AF(oT-K!+e5Ne#s!l$VmY{ z0M(dBCpJKV2o+cj+;TAD<*||}B5pf{0WyDZcshrYsnDVYk5(t6hKy>)B<~iib(vIp zhSG;--hKxnGC=HbCm|-gaE0=49-q-HK@eB`b?HL1(Q!V*6!(gzx`EkPmMG z;RQ{kGHgJLVIwpJ_sbe0j{m6^Q|WsHTt6Vv9b3pWogp9*qN9C_S1*=mmxLDBFvg9- zA+N@QMGo8|INXp2zGW_d7#+pv;RrxGUMphx)7D7`#}(G0AvhSuuh0&CFD+XL*D~Ql z(Ujob8j)rDJ__@wTdWRMiIH(xx1=`sCEd1I9LVFsyci;9s+IOdhR6_^Nd{QYNMUph zc>qXHumnvg9bvcAaE;1VxEL=(B)_nVNh1)c@-d_VzO;;+JI+^uXj+i^I9wQ%@q*@{ zNMjgf1Md&jpgldGZvH&o((>(bdzA={oy$@F799o^XF1}+4*FbgiA#lie!E4!V?Ba_ z8!#=F{7b}p(|PvHWr+PX+!BpXC@BP@AqJb0Q`)rqW*X*z>h~ z4L|VUwN@z;$5HtkqEtxnhad}=E%<`OxJWJyo;2&mP55W-5AX%h8?OUX+TR?ZQ4Xz+ zxlk5hH3bT;q6U%!t*6yl??Ev< zK_dY}{xR9J00UzBPb0bJk>)CLBaysd>1A%(7$1nS>X4ymgx3x#99qyGo`QZ%$y-ue zD3>wxtv4q4&)B*0$GxPf_!kafjT> zXVjZCKFt5?>dF2O#|KV4?eV_1di^b0R8;M*rkm1$;@otU$K{r+#rf((nS2iJlctm2 zjRYz3#fb~Ci^|2zl&4CrVphwib6pz=tK|Ed@YcAS?)1V3ftDZ5OeHH)`LP>&uM{*N zecz@?9pBTuNqB6>g8=!hi#b9%$y?H!Wp}ueqD`Ktzre-PPv@)J%ch+yXvQJuE7pMWc@L*Fyw|(xU{s3)2j(Su_GTB_o@u zLu$emFmkypWmq3X6Qm7WbL$fmN0k%Fn)|?wd&G9T-4sIEGXaqqPhSGl8F<7)3^v`l zCIXq6BVL0)(&<6~sstd|Q!zY}rbHq9Kg0=nNZB|te40WH za%c@i4qR}BgsA}n!p1zEQ7>^^x-;GtebjKY#v8yP_(c#R@V6fckUph7uN`(Ed#1<0)jwR&M0F&u z1iv@V0MhPWc-LKUs7xqfU5epC9`q7gNyyeJi8!k;&*kGN`pM>4YLRp?^?Y?HE|d`nY_i zgc&=@VexV+-G?xNh;J9)f!G5N+AWkq+XZtzi2u{#G>vyDLIPj|NeyZ>#I{aZLX(Z( zvg1-%EJX+_W74r_bRmU?hisHW<-uhE3Qmz;mhs@>lrpB~bVvUYSAIadD8r3$o}rZb zc!5H~(Rvv#wdOZqX=Yq{P*)|gCfWTUhG1zit}h#bxn^@j7NjH^;r(j$ys(~e(cB!E z_}1QA=bdntV>Peq_!Qzxz|z)LIqF+1RNKSCfK`dPzYbRVPq-LR@t%;%ES$KoYZ_sl zLZ=d*YQn<~^^{K|NtNMs48@4HPm8A_$Gim%i_c{qCvS+83?idV@VD22DeawU&BX9T zV<`1;&}9d~2Q9&QYH6z-=t96lR(mF%B-s253s;UH7x-9I3iGWoOdcGx`A+o-G33_Mr4~u>o4O`XbLP_pq*qs z<_FnF&*f!mJDHuX1+`zHG1gY_iz#@hpzuuWr^!vYfdV7QXMNjg)Sf2TaImZi76>*9 z#st`FOr9n>=2|dPj?cy7&YE0MDdX(;d;1Y>Rk-~!g+3G4&!z>%A#+`jOCVa-JtWb< zX8SRitO1^*x&d@)iB5qrPc%QO*NLu?H)qKu-6=N$c?BIF3vKX*@`U&0KOe__8=jI~ z`1+=25ww+F``a%5r(=gm@;&$X(lr4yzxgS4S-Hll*`qFI!Q0j@^9?-ifp*wsg%g)_ z5KkW*wfJ&HhiHrvowK|mlv=h2zgKp?Sxs3KJ5A(PMCkr+)ZZcaMrB;jrH0>DDZ;)Q z?b`e0mn-UoJ|m^aWA;n~Z~G6;H>BsXunlg!9&!&Q znCNMyE^BbMj6QLDd@;FdVE)t)<;WtT%kc z6amP;0GCO>j>nfy14qxeGN!u#DgNQKze}{NPbxK|N=)Giz{-Plu8xi-WMVG&$rwHe z&lwVwOb&RZ1XYDFp~4cVHfZyrQAEDe55wiZ!_XV2G>0MkL@WNLD8N+CcEQ!NIZiQJ zSsoZ=2gs3z-Mii1URuXziTfZi*Dihvb99WaO7INRI!7!`AO+K~ATR0SR)#doCdbpD zh*x9c1=5D;Ks%_0>rtOU&dtk8v*<7$9$2DNeLo`HX=Zn8#$^_0s_zvpDVIzed zqmk%!0^hXS~(m8sD@jbiArYf$fRRR3T%9@hs4crdx3fwls-kcKNN_& z0K8Y$@>t|F3cfx+s*eH!E&?Sep~<#9U^JeT@kljdWtj565CB1tm_Eo;scq(fuMo8#B;`6#V(mVLKYw_+FI<2K_kNcsMD{P+weT%`<+X92q{wAs zd{T&%s||n}`kZHCHuljNV=8rXJ1g}oc#P8#-9qq_r1yMSMzmz0#TwKD!_|=Ifs-wA z12~Pu^}50P)3|LWsf8al;0jhn-llg}?jRQ8r${-tB(Amx?-<3StxMT>~c z9u6FOjm>y^M>tp;f&Cv8d!b752J}Qk?s;LqJpJ}FTPN8VI*vf5^K7(%6ghF=AxwN% z8lK+>_X^~iS0kVI$!~xi^uEc%&|>6{mkIxWREdiy;Z)oPGn+8kE3&$7T9 zH&191aoyypwaNRff%mz-k>%f=rU{P!%sAAx|3-46#mRnJh23Wd+Byd_@+_m7_Ye5H zq&mF`^vVm&e$EtQb8zzW9M#;1zjVIpw_rs>Dm(zvKdUX($G_4CmJ_>gpj0_ye;Vl* zQ$actPL{iiIHGM#xy4_(r{#-tSLZB$RJ~4xpZVNs=ZViR@RTDBq<5GXQ2c z-p#`*jszHN3p7%t;(ronjea7nCC%Gn+~yK?h{8M_W2`EKxKXC1Ba z*c(le>iU&6x08qCK%_Dz+Qi3Rsx>+F&{X^E)QKVZDy7}hF(ma-XkhyrSWvMkjiCZ& zQ1yKSs3IsbPR6wf_M{}9xD6c^J& zG|V{del4Lrd}4{IX3G&Dl+$%@O!%f(7c~BbP3*j^byahnRAZ|b66G)U-H;XbE4ESE z`eW~ikN<;W;8Z4?pSODw*jT+y4-;`A*@OnA>DO=D_leVSz1R7H$tIdViZ`=ZiTcVF<7Yma|$SEQ&bwqI#eeCAl1i;O9-`v;{;Qi#AC z#*9OS$9I8I@y?#$>GB%J(Zp2jrPwvScw_%>M|bDAX2}n2X>oGS-9~-4cJ}VLbq|sQ zBF;Yu!G#9SOR+S*xT5sZ-~USfDn6ffg0^bg`r(~x#@M-)>5De*%iEW3Y+L`;BZRuR zD2(>^{WhHI5XGk&puI44h6_sc6k{E3q1j2i1<;zyyD??&oA6vHYCjX@Cd4nLCq^}; zLnzHW=oj|K8x8R$ws18&Tx#*Ezs+o=47EF{6%(buwV zLCITUB1aye3jU?@89R91$hpz^g%K}7GmZXb@G5rgFP)5}si4vaFtVyZIlMvBfG@OE z&n6~zz#(fXrhD(;P8iWm?PTZ~2_7h>kxGyFh^=3I?<(XU?x-$M4J4@VdP{z>ef=VMKycpNAE^qw(|)3edZz{ZgrZ$3?(E#)5a&Y0;qqZlJQRZK6n(_ZbT z`H{|gvJp0x+AkdZ9XUylA$VM6u)RPaQ~?Uwi8CFX zeA44}!bYA-s#<+)x0V#!7}O)JB^s(<^PyZsymN|;ai%fhT$xI@2eHjDKt}R=c5i#q z6v+(vG;TUETbCNbG`)qRTWceLBI)$Kzg1#QmoX5bcFHYs8FI{901^40s$70!6!Z&`-H)! z^buDhneTo8xgf%i7~|-~SfUJ3%ads`gvMCIzu0SY)oq2xpgqx~#<|QgJbL|?PB`tYrfZF) zrfJUoBfDPdznuBz)$d1kyqjh=!~Bxbv~y>ssy-I&)|001c5fQKe^=mIRq?9KV_%kU zL1|3X{rhDeNB;WPIjpwhC;cFA-_E>L*Vv&ExOru)nTOz~>F>2@7m(ATvx(T$j36b` zsJR853*EhZ;!?R*7s(QgSKv@1ahY!ErRXRC)_(xuJ)X2jOkwE0Hs;YRsNPFIK|%vq zfTp4V9fzTiJPjS9ft-T)mZ>elJV--l#J`iFV`AeuAFEQn#Zj<${HTl_}YDVet+qfbvC<3(~Ei0E0rI;HRlUjHdQ-c-*_(9 z|74V=q7VQfM3)oJ$jwx0HJdK&)@#TULwlZE~s6MO~jV)YF|{X zR#-|c6Osq$deZB6YMz~!&)t24@$t`rnwcI(rp(^LeOdRf8ryeROXV|SoYpOCEvRz& zr4x*e_@%SFe}ehL4nIw#_tLS=_FH^kHpzdMo~VGbU)p#_w8}@^4YTa zuFb<7%&|HBr_Zaun0Mu=5BMwxfDyHjF?wLM(sbRt=iGZuO~adVJaBF=QeUoDI!0h$ zwTX@Dw*0>=6!}R2zlZ%ddK2F{JB0)r*YL4Mm<4_k)WhMsIQ^OzzCUmM^TFZXlCypb zE=44)Gl{$Bl}kIMptNGFShX|ZxKyeAzq9JpV*;F__>`*C$ zG7!fUAu6kY<9N)4(GMIE51cfTThS!^(t(acSCwnfAtdbpdn_r#Hf(&*PDAYTZ9Yw> zrI8fJ5aLybS_e}_sKNym!F`7+7Mwx6@hl;Pw;&?fDCnUEPbF9(g*BqdqDP^6+ry#2 z=C#vUvpKRZ_|Hf124}rK4KanSOAm^hbPYiqZ~^d%(E!D;TnwBA?Gu1=T>uTZYi3=l z5C)ge9-R$$0I+-tsIdBB69i;k?j6n4snfFxk$cP{(Smwp%8^T+S$%ghH*Ix-s?%YNPiiT{BST%lJrn()c&9?`j!R6TrA$Z>MGL0 zXJsOlw#rc|eTVH1>1fub@|V?)1mEn998OZY;$=I;jKJw9yLn=G8xp&tTnx`Y0dr;rQIxD5+SDjr#jfPW}9Pt{7v=gmX_@c$u?8& z-LCo6@O1E0Y3bNyU$(}p`7)c4(<8f8r&U49`vSL***viDh6 z3HwgyiV131%)F&vXY8)@8E;n&#}4h}Nnqywm(J1R^Ntxiw&0A>_T4_HJ-{77-$Ekw zS;Bn+6D8V(ZOa^cD))V&Ix630`##U--BDHfm8V`^vHx7E{iUI?R)OLE_$FV3Cw?4G{Y>=VYF=+Z#^gV_^X!XyJ$uGZ;@}8`wgZ>6nIArm$)uG zSljce#nj>X)6{}D)G*eMk6mAn<&C>;N_{Ow(^Ru9#sp`Bh;PnX`hey(5bk$%g9Et$V`=4GPl9|m84^;*86C`+?y{}s(}OxzdsJoO`D zclC5%tWss2$)X;dH?b*7UcIdL&`oN><#V_1 z`hB(v&GY?sz<;$vc;dVVgFDo33k!>06&1gJU0hP|rl901NbEKl3x$E}0=b6+g?V{B z2X4%Y{A=qC;}hGGR<^j$KlqQ?{)m>ruDoh$Lop(c9tiU2!526l$~PZ>!`P}Tf9V96 zP958%PF019_>)yj&mW0yKr(%oM(*>zUskE(rK^yalVPVCvkR#nuz%a6imCi|yh z>2{pm6kfs$|2A^PbN{1Vuj9g>`zt@Hf95_PJj6nO9nQ%0U+_mK2k+gn>*&s5+WM>q zy+5NCrXD#NW%A&(jkIm~si#NR*Bx!$T@T>#Rcvh5mJNx=XJpOTwtXYaot(%sepU#Y z?_PJ(DNK40fE|L+TKk5mzdVyZxsPIBTgq)Ky0?v7q@Vt!a~*3Eo{rh=$VoD@En>ym zul@GQmOMl5`)5{GyZ@hG2C|k`hzVuf#S3GzSJ{6H>^srrx!Gw?E!AenJI9>uBdYxc zs(bh^s+%92&iem6e0JKh)VF)jKTq}+#_mt-@FEW;uB^icU8tZmnnv+>8Hi->q_Xb3 zDPU(VI)pRc#>LB5mI&>0+dnUl-y_B+#4fpVL70S}DxdY9Y*c+M&=*zF9Jc%2dbbhV zs8icl*zn^E&BrxZ5l)EHKWAz1&IGHsy&-#1_41Jj6L0G|*Dsd`&wO37`&b<3XAg!d z;ZdpBKEt00=F-FaMrTu)7v+>a5vuY7p-@Y8gO4f{0^XTB?Np^uOZ%n)xl$_%d%G!S z+!QBOhty)tktPn(gkwvu4y!N;ubA!%ZnjSJ)`NP?mxY#G1WrZpWTmJ^M?+H$kKfM%op!(i1;Jmo;P4FAC{wWz%w7Sn zh9IdV#2e~@>IOA7ginscE&?POsk$H!hG8-@b##dQg32M3xdD*~cY(A8fJ9=AKGQ_T zMfHH9h*X(~G%22KDxo`t)rPXBLNf_kRsajH6jF~r5(?NQv9qnBcy#uwNveltMw1Jk zrpsQ)lS+9d+IS8X#b`&+IU_d(Z**M9SSXv!#LWlxbyY?%jK`FkBj^`OMS;cx+z3_E zCCZR^xjJSJ3#%=;j_I#!CX%rAc5h{TXm4s=ijP;&m7SpWB4lDGXV&mdi_=0>8giv? z;{;&~QiC-HMRUI=Rh4#M0L7cvxxrc`U}z8!X&LXN%-2fs_XGCFG*cm2phC@jVIk$q zNhQUNtB46XQWg$16O@5&P!b~L6NoT?bDS0?l+SQACbn%QSnKgSdW9(s!OniIk&=gV*Tn61E-M@dC2MSW~r}&hJ6P z8gt?q(2*g-Lf8Q?<5$hf47FR}PrF5%)~FIN6I-l2b&7di6OoF&n`l zDr3sM-6CGE%O$7t(@Z{d-;+W6h;i$mCD^nF>t<~~cJ}#C+uuFonb#7EGd+^q@>W6L z^ldj+?#=T&Q*pGNI^M2S1QD~AXSEc`@`{9MVy`1z$7;d@LZ`mG?Rm^|d%k#_vyVROyBEXCk#7yKeZ5BSuSLSbTZ%UQwK(#GK#^p=-WQwgAWdD9R~UpOxM|I=F~@C!?Ku|511A`jkzFM))rPv$5)Yr)(1o*Vh%KSbgrY zy28(r-Pl^qM0jq=NBgAa&oift$F**6wtq>~laHka+MF)*8>XC&wf=wQG6J5jZCs+|=#LsDQOq#& z312w|GR_T-apf^;r1Lwa{#x&!!`lMX_`PSI-DPeT4L{5qs|x+F=+1R6OZs?5f7#=+ z$#yqdXFa|aly2X0_wrx;7V`B%>FyT}B0CcgpX*l_=x#sw;y}!{m{+7D%?}!>rv3Iu z))fU>sFp(Qw*?!FHzRa%79`v#IsD)7=$yM-l~T3M0)th}<6{L}9g;mF?175%IIira%m zTdMH;KfQR@fxbyQH1}G)Un|Y~+4F;$BECR8cE zFF;8`HLC#UJ=DWMDNY-rBbm~#Jp)8$(RjV8K4FTefMWrvSNv*s!L{v3yf;V_!yEDxxa(MqdE=6&_ z8qQ20g9ZnGX&ReHyc0Kq07}ekjG5?W(daHC4VQ~mJo&$07DH$@TMcN76|E+TGrodo zDcC#Eq}e9_rSs^Ukzpx%4L&<+xxuz!%^K)c}sFsrREcbZ;&#O48Z4|XhPQcq$&RS;0_1KUY zcEhz|9rKdd`ilHeg57zWH>&Kbi#OEzypnsO54V172;% zUS6su_r*g^?3&KbV~5*1INr?pdFknu>_ZXO8GS`}Ift9iuyjwme;R z;-7i*jX$4HT)JRY!>)~q2m4p;Y}>fgzddkSd4cM4wVi5fnY>J#*~|X8yKLEAZm-J+ zib-To;w^J4%Nwz~a|P~OomvhZ?!F;ga@E>|u*dybfXSH~@c}>9TmY@0t9_47p8rB! zTmSU#VST!8yvJ_*i{t#J;O#B#@yQVpffdEWs)7h(KsamI)SwzNdU-(y65F4Ak$?v} z=z+_APCB><@RUzM(aIPx|F#3=ZA4$FRwCpARJp){G}c6NmD~&_;JU~N9EhL`aypc1 zJy5Yv3{_1uPjV;JXRWap)eb~*$4ms`V5<9sVWL?GOEJ-G58iMzJ`$9O zHHn?=_G9lx;zv{yvXQ-AP?HBf>EPu8q8K3*GEKi%FX%# zKS4trY*Hr^qEd^e22SrAS1El3YDZp9PVgkjiVZ%}LH|H`m%w%+lDk`ja9YC6Gw!Q8 zDgQqsR=(Aw1^h}OWHcKukE2qgbtV$wr^&ep4~YBRomi4N3g`CBXLKB4q^2V-1uRTe zTq(Ltib_CoGCT{SK_G_6R&D6uikwc8H(-?tUWa5a2dXio)3z+hP8C|~AT{f|paKpN zP4GoE=qZ((~0ZV(>HQ#*2Cq)LtuQSp4tdYU@eFzeAJ8Q*Gp!r7I_!5y(SUI_o(>($CG0p5T(> zc53rCcwHXyOet1LlD>~K_K3CAv8yOvy9M}zDU9AC`W!T{yx;w4k8Efos~ru~eRLwy zRM(QX7U94F$5$YiumO5T=na9>9|)O>0Xw)9JGH(&zVUxOYd6KPoe&1LabOz=KM;Yb zyJz5X1#CNehSU^?qj@51S#aNWa}={LvRQ(53y~JA^>z-uBj?@vh9~nZ3av$ERz4; zTk$w&IGkfB-;TOUu=wz^w?CYA^$qs&pFH=7h~x?9qu-=e79S$aj_ZRg_bRLBjMX#Y zq_oZ)+W7ri)|tM{$MrA*p;dr|eBmN`Mc1w%JoE+cs6gP1=Eq>Y7_F|T6MeE2B zZqmYtn5Y%zKYA^;<2q>uSV6yIU7VPwct-MF{yg*g{RKs5Cg|KNeJKs_G&kKRac|lQ zI8zt$0P9C0-F+G23H<}{yJ1PNJn-0~&o^Pf;*Gl1*~k^t>V8$mg&_9~VPq9zpHt*Z zsj7J^1Ika4h7O72y&8%#k1}oFnnvtU zU*zv#a{gG&(=!(ip&V0t)^@E<{YLNl7#8eLCizAEkokTRuiwMxY^NG{=U{dQR2?-+h_m&szh82cN6?m~Z8mgPP6fwPAvMIOa;j zbbBb^QQj?XE@hD912@y_@>(NLAQ0=zOh)ay<3Q;e4&`nb^?_p#55vqZ=Bm)QylE17 zI5=Kv%Zk1gZgFV(W*LuGYO4IH-7C=cNeTXR99=N-w%d1f*wH8!#KB;@!0VM)QDPM# z-QFpL(}Z|ETS5=5YWf2yk2T7b3Ir;o6$s~^2IXF+wy#s!4PaBes|1KfHKFHnp9K2x z0(Howf|&Ef7T5yjytRO*);AHbAl#z<|$Jd~? zl+jp`3tWHNjXtnv8K zwu@|LcQ`Qez}UAYA*yQr9eIyp0lusTE*7jL_KE;Pe=feB-NR&UO! zdVwo$;{J11Rst*H$odj2(}@fUT@)gyepUGu6Jy>#ptEHmS>-a7QBbFyX+mt6mJkSB zv67y4PU$BQIGr^0B6<;NgEdG~5yOy9O-`zc6C+Up5Qc|M$jSE~)>7;go=ZoNYdjmm zXGv_F9;QQMJb>N?_TQn%^SK)%hOI7W7CBDHq%YgyGz~^SePaPX#_3({27VWA(2P_Yo_}%GA9_B##s7H89%~Uh*s0rcm2pYKZIQW;Vp47 zV@&!h{s`l@|1FW+g;=~NDp%i1C*xLdY z$kgy`)C7Pu&JaI0!vKzx57wEby3-CkPz0_|kZ@(=gBw5Yh5!4yz8rnswTL zVxW=`OL^KT+(u=IY6_LkqX4?k<5U4}7-BWjrTs*Tz~f+Iorq_aOd|Qjce8JYs5cH0 zH%kSO!wgYyfLr6q*3AyS3Zh3 zYC^bDUs!}&DA0tG2-b-J=Od!{YFG-P-(k9(N6*G-sc%tHi59f%C>Str*lce;RX6pj zMgpcX%eW;3@`tpLfjBFyyOsy*g*@cuOP~=w30UtbbuZf? ziTb6(f+!yh2?wM+5`NM{%?YjEFis#gX0VOb4q^r*4Cct=MOeHwsHR}m;+BaW*|)gZ zo2WOnRk5#+$Q$YiYh%$#e*a#__E4be*}f zfcDU7DoGySjW>whE3!-^m_&YlXM>#?Ia1@mzO35z?|Y|?0dRf_$;LkmTzmf6q2Idt zyV{8B+PZp9q)(T(KA(HvzV?}EmfosuijSQO+@9qgxU$31EiKcIZdXBjkUH+7Xwb0m zIx4S;4Y6TzlE}99byQn`rGp#mm|PC6Co%lRS=mx#20c1%gX0}`qK}iIy($jbcffz_q3_4n zbS-5&EvF4suM{=Bh{=ddu1U>L&mTD2^(bU{e%7;qMF%?$wVlrN37xCAZe%TO$)(<| zlS{b|mL30kYRyi&I*WxXQlqoUgJ1Z{O8+efc=PSt*3V5$saRQOS7+0*sV$&5VH`s9 zv~TK)O}KVa_qJksPMr@m_LOJ_ONAB_Yc5<{*X`wfX1Rm!O=*nR7a!3`;_UuM`XbrULt*`Se@}$pl-$zzGjkP2vriUTo%Q|8?eI}m%Z4Je z>cN22dlZ%GS(~dmrxfR6F<-gSlX_|16cv^DE)=o^vdiY?V0s`aUb)0;!I6rRc~a4t2(5I$-#Yn6O~2p`KU&}%zP^OUIjSr*ab>@H+(I;{ z?(`Y$vgL<^0bTx--ro;63QtW$JXQPdVIKg_OJ*`of- zk2ECAbP+xQV-jik9&c2+l)CMieE(a`;%`nCJylk}AG}fHEE;)*YGX5D#U!>q1ib`PCiUyWUGgK;8zus7u4jqhpOTq*^Ja#t5E&l^vBTqONIm}5`s ztJfH=QD+@*Rh<%%#`cTGvQHI@Tnp**HOr1}>Ca<*C|5sgbNNpyxLxqOm&*>(m+GZ0 z{a25L-ZV1iTRYoJd~fZ)fPG#~inU&Scu)I{ka;h~caL~@{awXN$gpc=9Js~Jb11!^ z@GLb&yy5=-q&vP6%j6`qGH$1EfM^sub>9!Q%_Q=A8VBX3Nt))7i82f+mNn%_cYf2I zcGCg|iq`C_TO19Y0fZ4iW61_KQG)p+(y2+Ea!@Tn`VhCFcPo#ke32xoLzsVQc}S~~~v#BK+NKFW_ zLOkZ=o6DoS$Ai_%WSOlFVYA6tJQ0T3kj?{e+tFCVsu*!nmEAj8gYFr4p9_5AON;Y% z(t$!8DNBc?N-oVi9S#5EpN(+a6~uQAJ-a%m&sC)P zlIqF-O~l;zS_cuZLi^2986X5-jk^pI1SHeC2eM>BP7SOWh+I(^lW` z2zuxqJgS9B=xvyOqMnEow`Ej8sSdn4m<&J(q#%bY9>QAoMNjx7B_P5#h)o2@5pAOE zA+9|s0q4SE$d90p0y#`&(2$at26zjI@oq#0REWm_(m27PH_}ms(-(n241!-W^VRp7VW}zhndF!r92=UvWFNq?D`F zL`eYaDUm6z0oH-~j{%|&I|XT{J+*oQ-d=Fw%_J-yAM67&toG13OOZ)t-%%2()G)Jz ztAS%}QU_K&-3;p#qYNKBkN$@@?Kc>ugC7NQN9JtIZ?QgNi=hc|W)G#7rkAc9sR=ed zqp>I{^xLyxu=qm6l<>Ie!v{Sghn$=<>xmhI2D2rYnw$>fM<-`;XG*!=_jm1+`)^}3 zf%jRM%=>D~hC3hj=5EIu9EJn(O3|~FG_Pk>Mp7U7HZkrUXR*duzMz*^qu%OIHk4oK z$+P~Tod4~6K~{d|Z*|LWsaB58ay_)GY%V|gV|-Z(u4V1WTHgmaOek_!H9qaAQe1(1^cu>+nuTfSN-4SQy9YK}c{l7M2v?8n z;1v4v^)Pq$Mz23jTy&C4Bg6pxu~aqjv-;vE^_F?XFtY2ch&B@N*_1uVP9xp^GNJL> zSnHDS7#*(E+Uz3d80r9_mROXKMEAjxF!SZi?(6_TfUSdVlGAF5@!86NZrANGzU)fJ z@TK~%Ja???ZVn6h3BKAk0t4&4kwHsKQkw{|+w9oc{Q6eQmnVxa2)~WH=9h<_E?cM1 zoq9<3SZ82pUR}he(EKI7HQ5% zU0z(4!O5A^@cOg&nkq;4Vk7gzf<WcQ zHcHxxBHZ(4)vU$wA5O`i%bgCGI>@6+4UX;-p z!n#Hq`mD&uyI!+n?R#A<_BIv?7wj)d8gXlp1|DrXX1d#zUUY9$#Gfg}p?SY3hbG4SoNoX(60@QqkCbz=Xn z@^3|7oY!ZeZ>7B6Ql4i(Sbl0b?;FiR?ntv%`o@PUJ$F8M{-!?(JF9*-YP-Yw3zX&2 z0Qpl6HlJEadu`X8_59L3x?LTwnL@bw&W$X5-9&f$rz2_IX0LU!OKzWm(z9J8M>US(#b$3RG^IU8MWX(wUWMsTtlC zSXtV|pfv5Kkn=)jNzJ^bl3Jo&#Kfe$p`sBY3JQt{?DsmyeSd%LF|#=syf%8-jD@bT&hSJ zN#097tveU?%x63Q&$4%(q7nNfmmqWKhL0@vIzU+25ZJhBH7}^v;(mTj(f;B0PR4(H zOss8K;~8Rf)GmMfvn80$St;_Ak5#sD2W7O^f-7{qs#@4Ccpl~2!@UwtStLnWMR>XE zY|c>+ml)FJ3r=er^PhBF-B|fc{rcp|eHAYYZ)|A%D={af|L}*=P47qIe!%A1*}mOV zvzuD+B>eQ>1N#GTNB3uaJor)?7?$Z+`3rY6ST!lnfBWyWmxt;o*Dz)k;p^|d`FGla zxP6aR$?ExQxFI=58*Ap6)s8LLzIb0wRLJioJPkhkS4IVGCvWZi_Z#~9zUpqv##}G= z3_e`ju->+K$+{X|Eic7m`_taC{1dB}GmGA|hTAR*%E~_&bS7GlQkx>6Wxda$xtfQx6LU*GG%9&za zj4mAmg0t{9eDSpY?}igf(Tqj^UD&OTcmYTOLVc1RE%N>vu{Kp6#;Mvn$H-7`j^ z0Fz*lB&gj2_zrP{M8n3T?R4}^{_ScZ698#mY++;6)Z}f%_yaDZ5K0`t)iaKMtc2_h zY1&Zo&EBfSvJXB4&jSE*HnP)iQ5(5vv0Aks?K?S_{oK3&B?Cv8dID^cK>>a=3iXCr zI1M;U-cBS6BLv}I1ADq6!HDBBFSH$=j$*hSC8}vC^;<7MYd@VzSx2r!+mQD_@<