2026-07-10 20:31:52 +08:00

1450 lines
51 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'dart:ui';
import 'package:aslan/chatvibe_features/user/profile/relation/relation_ship_page.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/chatvibe_features/user/profile/props/giftwall_page.dart';
import 'package:aslan/chatvibe_ui/components/at_debounce_widget.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:aslan/chatvibe_core/utilities/at_room_utils.dart';
import 'package:aslan/chatvibe_core/utilities/at_user_utils.dart';
import 'package:aslan/chatvibe_features/index/main_route.dart';
import 'package:aslan/chatvibe_features/user/profile/profile/profile_page.dart';
import 'package:marquee/marquee.dart';
import 'package:provider/provider.dart';
import 'package:tencent_cloud_chat_sdk/enum/conversation_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_ui/components/appbar/chatvibe_appbar.dart';
import 'package:aslan/chatvibe_ui/components/dialog/dialog_base.dart';
import 'package:aslan/chatvibe_ui/components/at_compontent.dart';
import 'package:aslan/chatvibe_ui/components/at_tts.dart';
import 'package:aslan/chatvibe_core/routes/at_routes.dart';
import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import 'package:aslan/chatvibe_core/utilities/at_loading_manager.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_data/sources/repositories/user_repository_impl.dart';
import 'package:aslan/chatvibe_domain/models/res/login_res.dart';
import 'package:aslan/chatvibe_managers/rtm_manager.dart';
import 'package:aslan/chatvibe_managers/app_general_manager.dart';
import 'package:aslan/chatvibe_managers/user_profile_manager.dart';
import 'package:aslan/chatvibe_features/chat/at_chat_route.dart';
import '../../../chatvibe_core/constants/at_screen.dart';
import '../../../chatvibe_domain/models/res/at_user_counter_res.dart';
import '../../../chatvibe_domain/models/res/at_user_identity_res.dart';
import '../../../chatvibe_domain/usecases/at_fixed_width_tabIndicator.dart';
class PersonDetailPage extends StatefulWidget {
final String isMe;
final String tageId;
const PersonDetailPage({super.key, required this.isMe, required this.tageId});
@override
State<PersonDetailPage> createState() => _PersonDetailPageState();
}
class _PersonDetailPageState extends State<PersonDetailPage>
with SingleTickerProviderStateMixin {
late TabController _tabController;
final List<Widget> _pages = [];
final List<Widget> _tabs = [];
ATUserIdentityRes? userIdentity;
bool isFollow = false;
bool isLoading = true;
bool isBlacklistLoading = true;
bool isBlacklist = false;
Map<String, ATUserCounterRes> counterMap = {};
// 添加滚动控制器
final ScrollController _scrollController = ScrollController();
double _opacity = 0.0;
double _scrollOffset = 0.0;
@override
void initState() {
super.initState();
// _pages.add(PersonDynamicListPage(false, widget.tageId));
_pages.add(ProfilePage(false, widget.tageId));
_pages.add(GiftwallPage(widget.tageId));
_pages.add(RelationShipPage(false, widget.tageId));
_tabController = TabController(
initialIndex: 0,
length: _pages.length,
vsync: this,
);
_tabController.addListener(() {
setState(() {}); // 刷新UI
}); // 监听切换
// 监听滚动
_scrollController.addListener(() {
if (_scrollController.hasClients) {
final offset = _scrollController.offset;
// 当滚动到一定位置时头像和昵称应该完全显示在AppBar上
// 这里计算透明度,可以根据需要调整
final newOpacity = (offset / 320).clamp(0.0, 1.0);
if (newOpacity != _opacity || offset != _scrollOffset) {
setState(() {
_opacity = newOpacity;
_scrollOffset = offset;
});
}
}
});
Provider.of<ChatVibeUserProfileManager>(context, listen: false)
.userProfile = null;
Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).getUserInfoById(widget.tageId);
AccountRepository().userIdentity(userId: widget.tageId).then((v) {
userIdentity = v;
setState(() {});
});
if (widget.isMe != "true") {
AccountRepository()
.followCheck(widget.tageId)
.then((v) {
isFollow = v;
isLoading = false;
setState(() {});
})
.catchError((e) {
setState(() {
isLoading = false;
});
});
AccountRepository()
.blacklistCheck(widget.tageId)
.then((v) {
if (!mounted) return;
isBlacklist = v;
isBlacklistLoading = false;
setState(() {});
if (isBlacklist) {
ATTts.show(
ATAppLocalizations.of(context)!.thisUserHasBeenBlacklisted,
);
}
})
.catchError((e) {
setState(() {
isBlacklistLoading = false;
});
});
} else {
isBlacklist = false;
isBlacklistLoading = false;
}
userCounter(widget.tageId);
}
void userCounter(String userId) async {
counterMap.clear();
var userCounterList = await AccountRepository().userCounter(userId);
counterMap = Map.fromEntries(
userCounterList.map(
(counter) => MapEntry(counter.counterType ?? "", counter),
),
);
setState(() {});
}
Widget _buildTab(int index, String text) {
return Tab(text: text);
}
@override
Widget build(BuildContext context) {
_tabs.clear();
_tabs.add(_buildTab(0, ATAppLocalizations.of(context)!.aboutMe));
_tabs.add(_buildTab(1, ATAppLocalizations.of(context)!.giftwall));
_tabs.add(_buildTab(2, ATAppLocalizations.of(context)!.relationShip));
return Consumer<ChatVibeUserProfileManager>(
builder: (context, ref, child) {
final backgroundPhotos =
(ref.userProfile?.backgroundPhotos ?? [])
.where((t) => t.status == 1)
.toList();
final hideProfile = isBlacklistLoading || isBlacklist;
return Directionality(
textDirection:
PlatformDispatcher.instance.locale.languageCode == "ar"
? TextDirection.rtl
: TextDirection.ltr,
child: SafeArea(
top: false,
child: Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: const Color(0xffFDF7E5),
body: Stack(
children: [
if (!hideProfile) _buildTopBackground(backgroundPhotos),
if (!hideProfile)
ExtendedNestedScrollView(
controller: _scrollController,
onlyOneScrollInBody: true,
pinnedHeaderSliverHeightBuilder: () {
return ScreenUtil().statusBarHeight + kToolbarHeight;
},
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverToBoxAdapter(
child: Column(
children: [
SizedBox(height: 172.w),
_buildProfilePanel(ref),
],
),
),
];
},
body: _buildTabContent(ref),
),
_buildTopBar(ref),
if (!hideProfile && widget.isMe != "true")
_buildBottomActions(ref),
],
),
),
),
);
},
);
}
Widget _buildTopBackground(List<PersonPhoto> backgroundPhotos) {
return Positioned.fill(
child: Stack(
children: [
Column(
children: [
SizedBox(
height: 285.w,
child:
backgroundPhotos.isNotEmpty
? CarouselSlider(
options: CarouselOptions(
height: 285.w,
autoPlay: backgroundPhotos.length > 1,
enlargeCenterPage: false,
aspectRatio: 1,
enableInfiniteScroll: true,
autoPlayAnimationDuration: const Duration(
milliseconds: 800,
),
viewportFraction: 1,
),
items:
backgroundPhotos.map((item) {
return netImage(
url: item.url ?? "",
width: ScreenUtil().screenWidth,
height: 285.w,
fit: BoxFit.cover,
);
}).toList(),
)
: Image.asset(
'atu_images/person/at_icon_my_head_bg_defalt.png',
width: ScreenUtil().screenWidth,
height: 285.w,
fit: BoxFit.cover,
),
),
Expanded(
child: Container(
width: ScreenUtil().screenWidth,
color: const Color(0xffFDF7E5),
),
),
],
),
Positioned(
top: 172.w - _scrollOffset,
left: 0,
right: 0,
height: ScreenUtil().screenHeight + _scrollOffset + 220.w,
child: _buildFrostedScrollBackground(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.w),
topRight: Radius.circular(8.w),
),
),
),
],
),
);
}
Widget _buildFrostedScrollBackground({BorderRadius? borderRadius}) {
return ClipRRect(
borderRadius: borderRadius ?? BorderRadius.zero,
child: Stack(
fit: StackFit.expand,
children: [
ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: 0, sigmaY: 30),
child: Image.asset(
'atu_images/index/at_person_detail_bag.png',
fit: BoxFit.fitWidth,
alignment: Alignment.topCenter,
repeat: ImageRepeat.repeatY,
),
),
BackdropFilter(
filter: ImageFilter.blur(sigmaX: 6, sigmaY: 6),
child: Container(color: Colors.white.withValues(alpha: 0.18)),
),
],
),
);
}
Widget _buildTopBar(ChatVibeUserProfileManager ref) {
return Positioned(
left: 0,
right: 0,
top: 0,
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: _buildTopBarBackgroundImage(ref),
fit: BoxFit.cover,
alignment: Alignment.topCenter,
),
),
child: ChatVibeStandardAppBar(
backButtonColor: Colors.white,
title: "",
titleWidget: _buildCollapsedTitle(ref),
leading: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Navigator.pop(context);
},
child: Row(
children: [
Container(
width: width(50),
height: height(30),
alignment: AlignmentDirectional.centerStart,
padding: EdgeInsetsDirectional.only(start: width(15)),
child: Icon(
PlatformDispatcher.instance.locale.languageCode == "ar"
? Icons.keyboard_arrow_right
: Icons.keyboard_arrow_left,
size: 28.w,
color: Colors.white,
),
),
],
),
),
actions: [
Builder(
builder: (ct) {
return IconButton(
icon:
widget.isMe == "true"
? Image.asset(
"atu_images/person/at_icon_edit_user_info2.png",
width: 22.w,
color: Colors.white,
)
: Icon(
Icons.more_horiz,
size: 24.w,
color: Colors.white,
),
onPressed: () {
if (widget.isMe == "true") {
ATNavigatorUtils.push(context, MainRoute.edit);
return;
}
SmartDialog.showAttach(
tag: "showUserInfoOptMenu",
targetContext: ct,
alignment: Alignment.bottomCenter,
maskColor: Colors.transparent,
animationType: SmartAnimationType.fade,
scalePointBuilder:
(selfSize) => Offset(selfSize.width, 10),
builder: (_) {
return GestureDetector(
child: Transform.translate(
offset: const Offset(0, -10),
child: buildOptUserMenu(context, ref),
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
},
);
},
);
},
);
},
),
SizedBox(width: 8.w),
],
),
),
);
}
ImageProvider _buildTopBarBackgroundImage(ChatVibeUserProfileManager ref) {
final backgroundPhoto =
(ref.userProfile?.backgroundPhotos ?? [])
.where(
(item) => item.status == 1 && (item.url?.isNotEmpty ?? false),
)
.firstOrNull;
if (backgroundPhoto?.url?.isNotEmpty ?? false) {
return NetworkImage(backgroundPhoto!.url!);
}
return const AssetImage('atu_images/person/at_icon_my_head_bg_defalt.png');
}
Widget _buildCollapsedTitle(ChatVibeUserProfileManager ref) {
if (_opacity <= 0.55) {
return const SizedBox.shrink();
}
return Row(
mainAxisSize: MainAxisSize.min,
children: [
head(
url: ref.userProfile?.userAvatar ?? "",
width: 38.w,
height: 38.w,
headdress: ref.userProfile?.getHeaddress()?.sourceUrl,
),
SizedBox(width: 8.w),
chatvibeNickNameText(
maxWidth: 145.w,
ref.userProfile?.userNickname ?? "",
fontSize: 15.sp,
textColor: Colors.white,
fontWeight: FontWeight.w600,
type: ref.userProfile?.getVIP()?.name ?? "",
needScroll:
(ref.userProfile?.userNickname?.characters.length ?? 0) > 13,
),
],
);
}
Widget _buildProfilePanel(ChatVibeUserProfileManager ref) {
return Container(
width: ScreenUtil().screenWidth,
padding: EdgeInsets.fromLTRB(10.w, 10.w, 10.w, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildUserHeader(ref),
SizedBox(height: 10.w),
_buildHonorRow(ref),
SizedBox(height: 10.w),
_buildCountryAndBadgeRow(ref),
SizedBox(height: 10.w),
_buildStats(ref),
],
),
);
}
Widget _buildUserHeader(ChatVibeUserProfileManager ref) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
_buildAvatar(ref),
SizedBox(width: 10.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
children: [
Flexible(
child: chatvibeNickNameText(
maxWidth: 155.w,
ref.userProfile?.userNickname ?? "",
fontSize: 18.sp,
textColor: const Color(0xFFB044FF),
fontWeight: FontWeight.w700,
type: ref.userProfile?.getVIP()?.name ?? "",
needScroll:
(ref.userProfile?.userNickname?.characters.length ??
0) >
13,
),
),
SizedBox(width: 6.w),
getVIPBadge(
ref.userProfile?.getVIP()?.name,
width: 65.w,
height: 28.w,
),
],
),
SizedBox(height: 4.w),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: [
getIdIcon(
ref.userProfile?.wealthLevel ?? 0,
width: 24.w,
height: 24.w,
fontSize: 12.sp,
fontWeight: FontWeight.w600,
textColor: const Color(0xFF333333),
),
chatvibeNickNameText(
maxWidth: 92.w,
ref.userProfile?.getID() ?? "",
textColor: const Color(0xFF8F2DFF),
fontSize: 15.sp,
fontWeight: FontWeight.w700,
type: ref.userProfile?.getVIP()?.name ?? "",
needScroll:
(ref.userProfile?.getID().characters.length ?? 0) >
10,
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Clipboard.setData(
ClipboardData(text: ref.userProfile?.getID() ?? ""),
);
ATTts.show(
ATAppLocalizations.of(context)!.copiedToClipboard,
);
},
child: Padding(
padding: EdgeInsets.all(2.w),
child: Image.asset(
"atu_images/index/at_icon_user_card_copy_id.png",
width: 14.w,
height: 14.w,
),
),
),
SizedBox(width: 4.w),
_buildAgeTag(ref),
SizedBox(width: 4.w),
getWealthLevel(
ref.userProfile?.wealthLevel ?? 0,
width: 50.w,
height: 26.w,
),
SizedBox(width: 4.w),
getUserLevel(
ref.userProfile?.charmLevel ?? 0,
width: 50.w,
height: 26.w,
),
],
),
),
],
),
),
],
);
}
Widget _buildAvatar(ChatVibeUserProfileManager ref) {
if (ref.userProfile?.cpList?.isNotEmpty ?? false) {
return SizedBox(
width: 112.w,
height: 72.w,
child: Stack(
alignment: Alignment.center,
children: [
PositionedDirectional(
start: 0,
child: GestureDetector(
onTap: () {
final encodedUrls = Uri.encodeComponent(
jsonEncode([ref.userProfile?.cpList?.first.meUserAvatar]),
);
ATNavigatorUtils.push(
context,
"${MainRoute.imagePreview}?imageUrls=$encodedUrls&initialIndex=0",
);
},
child: head(
url: ref.userProfile?.cpList?.first.meUserAvatar ?? "",
width: 72.w,
headdress: ref.userProfile?.getHeaddress()?.sourceUrl,
),
),
),
PositionedDirectional(
end: 0,
child: GestureDetector(
onTap: () {
ATNavigatorUtils.push(
context,
replace: true,
"${MainRoute.person}?isMe=${UserManager().getCurrentUser()?.userProfile?.id == ref.userProfile?.cpList?.first.cpUserId}&tageId=${ref.userProfile?.cpList?.first.cpUserId}",
);
},
child: head(
url: ref.userProfile?.cpList?.first.cpUserAvatar ?? "",
headdress: ref.userProfile?.cpList?.first.cpUserAvatarFrame,
width: 72.w,
),
),
),
IgnorePointer(
child: netImage(
url: ref.userProfile?.cpList?.first.selfRing?.sourceUrl ?? "",
height: 58.w,
width: 58.w,
noDefaultImg: false,
),
),
],
),
);
}
return GestureDetector(
child: head(
url: ref.userProfile?.userAvatar ?? "",
width: 72.w,
height: 72.w,
headdress: ref.userProfile?.getHeaddress()?.sourceUrl,
),
onTap: () {
final encodedUrls = Uri.encodeComponent(
jsonEncode([ref.userProfile?.userAvatar]),
);
ATNavigatorUtils.push(
context,
"${MainRoute.imagePreview}?imageUrls=$encodedUrls&initialIndex=0",
);
},
);
}
Widget _buildAgeTag(ChatVibeUserProfileManager ref) {
return Container(
width: (ref.userProfile?.age ?? 0) > 999 ? 52.w : 42.w,
height: 22.w,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
ref.userProfile?.userSex == 0
? "atu_images/login/at_icon_sex_woman_bg.png"
: "atu_images/login/at_icon_sex_man_bg.png",
),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
xb(ref.userProfile?.userSex),
text(
"${ref.userProfile?.age ?? 0}",
textColor: Colors.white,
fontSize: 12.sp,
fontWeight: FontWeight.w600,
),
SizedBox(width: 2.w),
],
),
);
}
Widget _buildHonorRow(ChatVibeUserProfileManager ref) {
final honors = (ref.userProfile?.wearHonor ?? []).where(
(item) => item.use ?? false,
);
if (honors.isEmpty) {
return const SizedBox.shrink();
}
return SizedBox(
height: 24.w,
child: ListView.separated(
scrollDirection: Axis.horizontal,
itemCount: honors.length,
itemBuilder: (context, index) {
final item = honors.toList()[index];
return netImage(url: item.animationUrl ?? "", height: 24.w);
},
separatorBuilder: (_, __) => SizedBox(width: 4.w),
),
);
}
Widget _buildCountryAndBadgeRow(ChatVibeUserProfileManager ref) {
final badges =
(ref.userProfile?.wearBadge ?? [])
.where((item) => item.use ?? false)
.toList();
final flagUrl =
Provider.of<AppGeneralManager>(
context,
listen: false,
).getCountryByName(ref.userProfile?.countryName ?? "")?.nationalFlag ??
"";
return SizedBox(
height: 24.w,
child: ListView(
scrollDirection: Axis.horizontal,
children: badges.map(
(item) => Padding(
padding: EdgeInsetsDirectional.only(end: 4.w),
child: netImage(
width: 24.w,
height: 24.w,
url: item.selectUrl ?? "",
),
),
).toList(),
),
);
}
Widget _buildRoundFlag(String flagUrl) {
return Container(
width: 24.w,
height: 24.w,
padding: EdgeInsets.all(5.w),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.white.withValues(alpha: 0.7),
border: Border.all(color: Colors.white, width: 1.w),
),
child: netImage(
url: flagUrl,
width: 14.w,
height: 14.w,
borderRadius: BorderRadius.circular(7.w),
),
);
}
Widget _buildStats(ChatVibeUserProfileManager ref) {
return Container(
height: 60.w,
alignment: AlignmentDirectional.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildStatItem(
"${counterMap["INTERVIEW"]?.quantity ?? 0}",
ATAppLocalizations.of(context)!.vistors,
() {
if (widget.isMe == "true") {
ATNavigatorUtils.push(
context,
"${MainRoute.vistors}?removePreviousPersonDetail=true",
);
}
},
),
_buildDivider(),
_buildStatItem(
"${counterMap["SUBSCRIPTION"]?.quantity ?? 0}",
ATAppLocalizations.of(context)!.follow,
() {
if (widget.isMe == "true") {
ATNavigatorUtils.push(
context,
"${MainRoute.follow}?removePreviousPersonDetail=true",
);
}
},
),
_buildDivider(),
_buildStatItem(
"${counterMap["FANS"]?.quantity ?? 0}",
ATAppLocalizations.of(context)!.fans,
() {
if (widget.isMe == "true") {
ATNavigatorUtils.push(
context,
"${MainRoute.fans}?removePreviousPersonDetail=true",
);
}
},
),
],
),
);
}
Widget _buildStatItem(String value, String label, VoidCallback onTap) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onTap,
child: SizedBox(
width: 96.w,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
value,
fontSize: 17.sp,
textColor: const Color(0xff333333),
fontWeight: FontWeight.bold,
),
SizedBox(height: 2.w),
text(label, fontSize: 13.sp, textColor: const Color(0xffB1B1B1)),
],
),
),
);
}
Widget _buildDivider() {
return Container(
width: 1.w,
height: 18.w,
color: const Color(0xff333333).withValues(alpha: 0.35),
);
}
Widget _buildTabContent(ChatVibeUserProfileManager ref) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 3.w),
color: Colors.transparent,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 35.w,
child: TabBar(
tabAlignment: TabAlignment.start,
indicator: ATFixedWidthTabIndicator(
width: 12.w,
height: 3.w,
gradient: const LinearGradient(
colors: [Color(0xffFFD800), Color(0xffFF9500)],
),
),
labelPadding: EdgeInsets.symmetric(horizontal: 12.w),
labelColor: const Color(0xff333333),
isScrollable: true,
unselectedLabelColor: const Color(0xffB1B1B1),
labelStyle: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
unselectedLabelStyle: TextStyle(fontSize: 12.sp),
indicatorColor: Colors.transparent,
dividerColor: Colors.transparent,
controller: _tabController,
tabs: _tabs,
),
),
Expanded(
child: TabBarView(controller: _tabController, children: _pages),
),
if (widget.isMe != "true") SizedBox(height: 86.w),
],
),
);
}
Widget _buildBottomActions(ChatVibeUserProfileManager ref) {
if (isLoading) {
return const SizedBox.shrink();
}
return Positioned(
bottom: 0,
left: 0,
right: 0,
child: Container(
height: 86.w,
decoration: BoxDecoration(
color: const Color(0xffFDF7E5),
border: Border(top: BorderSide(color: Colors.black12, width: 0.5.w)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
_buildBottomAction(
icon: "atu_images/person/at_icon_person_in_room.png",
label: ATAppLocalizations.of(context)!.inRoom,
onTap: () {
if ((ref.userProfile?.inRoomId ?? "").isNotEmpty) {
ATRoomUtils.goRoom(ref.userProfile?.inRoomId ?? "", context);
}
},
),
_buildBottomAction(
icon: "atu_images/person/at_icon_person_tochat.png",
label: ATAppLocalizations.of(context)!.message,
onTap: () async {
var conversation = V2TimConversation(
type: ConversationType.V2TIM_C2C,
userID: widget.tageId,
conversationID: '',
);
var ok = await Provider.of<RtmProvider>(
context,
listen: false,
).startConversation(conversation);
if (!ok || !mounted) return;
var json = jsonEncode(conversation.toJson());
ATNavigatorUtils.push(
context,
"${ATChatRouter.chat}?conversation=${Uri.encodeComponent(json)}",
);
},
),
_buildBottomAction(
icon: "atu_images/person/at_icon_person_follow.png",
label:
isFollow
? ATAppLocalizations.of(context)!.following
: ATAppLocalizations.of(context)!.follow,
onTap: () {
AccountRepository().followUser(widget.tageId).then((v) {
isFollow = !isFollow;
setState(() {});
});
},
),
],
),
),
);
}
Widget _buildBottomAction({
required String icon,
required String label,
required VoidCallback onTap,
}) {
return ATDebounceWidget(
debounceTime: const Duration(milliseconds: 800),
onTap: onTap,
child: SizedBox(
width: 110.w,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(icon, width: 25.w, height: 25.w),
SizedBox(height: 6.w),
text(
label,
textColor: const Color(0xff5C2C00),
fontWeight: FontWeight.w700,
fontSize: 12.sp,
),
],
),
),
);
}
Container buildOptUserMenu(
BuildContext context,
ChatVibeUserProfileManager ref,
) {
return Container(
width: 163.w,
margin: EdgeInsetsDirectional.only(end: 8.w),
decoration: BoxDecoration(
color: Colors.white30,
borderRadius: BorderRadius.circular(4),
),
padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 5.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ATDebounceWidget(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: text(
ATAppLocalizations.of(context)!.report,
textColor: Colors.white,
fontSize: 12.sp,
),
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
ATNavigatorUtils.push(
context,
"${MainRoute.report}?type=user&tageId=${ref.userProfile?.id}",
replace: false,
);
},
),
((!(userIdentity?.admin ?? false) &&
!(userIdentity?.superAdmin ?? false)) &&
((Provider.of<ChatVibeUserProfileManager>(
context,
listen: false,
).userIdentity?.admin ??
false)))
? ATDebounceWidget(
child: Container(
margin: EdgeInsets.only(top: 5.w),
child: text(
ATAppLocalizations.of(context)!.userEditing,
letterSpacing: 0.1,
textColor: Colors.white,
fontSize: 12.sp,
),
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
ATNavigatorUtils.push(
context,
"${MainRoute.editingUserRoomAdmin}?type=User&profile=${Uri.encodeComponent(jsonEncode(ref.userProfile?.toJson()))}",
);
},
)
: Container(),
((ref.userIdentity?.admin ?? false) ||
(ref.userIdentity?.superFreightAgent ?? false)) &&
!((userIdentity?.admin ?? false) ||
(userIdentity?.superFreightAgent ?? false))
? SizedBox(height: 5.w)
: Container(),
((ref.userIdentity?.admin ?? false) ||
(ref.userIdentity?.superFreightAgent ?? false)) &&
!((userIdentity?.admin ?? false) ||
(userIdentity?.superFreightAgent ?? false))
? GestureDetector(
child: text(
letterSpacing: 0.1,
ATAppLocalizations.of(context)!.becomeAgent,
textColor: Colors.white,
fontSize: 12.sp,
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
AccountRepository().teamCreate(
ref.userProfile?.getID() ?? "",
);
},
)
: Container(),
(ref.userIdentity?.agent ?? false)
? GestureDetector(
behavior: HitTestBehavior.opaque,
child: Container(
padding: EdgeInsets.only(top: 3.w),
child: text(
letterSpacing: 0.1,
ATAppLocalizations.of(context)!.inviteToBecomeAHost,
textColor: Colors.white,
fontSize: 12.sp,
),
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
ATLoadingManager.exhibitOperation();
AccountRepository()
.teamInviteHost(ref.userProfile?.id ?? "")
.then((r) {
ATLoadingManager.veilRoutine();
})
.catchError((_) {
ATLoadingManager.veilRoutine();
});
},
)
: Container(),
(ref.userProfile?.isCpRelation ?? false)
? GestureDetector(
behavior: HitTestBehavior.opaque,
child: Container(
padding: EdgeInsets.only(top: 3.w),
child: text(
letterSpacing: 0.1,
ATAppLocalizations.of(context)!.partWays,
textColor: Colors.white,
fontSize: 12.sp,
),
),
onTap: () {
SmartDialog.dismiss(tag: "showUserInfoOptMenu");
_showPartWaysDialog(ref);
},
)
: Container(),
isBlacklistLoading
? Container()
: GestureDetector(
behavior: HitTestBehavior.opaque,
child: Container(
padding: EdgeInsets.only(top: 3.w),
child: text(
letterSpacing: 0.1,
isBlacklist
? ATAppLocalizations.of(context)!.removeFromBlacklist
: ATAppLocalizations.of(context)!.moveToBlacklist,
textColor: Colors.white,
fontSize: 12.sp,
),
),
onTap: () {
if ((ref.userProfile?.isCpRelation ?? false)) {
SmartDialog.show(
tag: "showConfirmDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return MsgDialog(
title: ATAppLocalizations.of(context)!.tips,
msg:
ATAppLocalizations.of(
context,
)!.youAreCurrentlyCPRelationshipPleaseDissolve,
btnText: ATAppLocalizations.of(context)!.confirm,
onEnsure: () {},
);
},
);
return;
}
ATAccountHelper.optBlacklist(
widget.tageId,
isBlacklist,
context,
(isOptBlacklist) {
isBlacklist = isOptBlacklist;
setState(() {});
},
);
},
),
],
),
);
}
void _showPartWaysDialog(ChatVibeUserProfileManager ref) {
SmartDialog.show(
tag: "showPartWaysDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return Container(
height: 530.w,
width: ScreenUtil().screenWidth * 0.9,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/person/at_icon_send_cp_requst_dialog_bg.png",
),
fit: BoxFit.fill,
),
),
child: Column(
children: [
SizedBox(height: 58.w),
Container(
child: text(
ATAppLocalizations.of(context)!.partWays,
fontSize: 22.sp,
textColor: Color(0xffECB45C),
fontWeight: FontWeight.bold,
),
),
Transform.translate(
offset: Offset(0, -25),
child: Stack(
alignment: AlignmentDirectional.center,
children: [
PositionedDirectional(
top: 31.w,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
head(
url:
AccountStorage()
.getCurrentUser()
?.userProfile
?.userAvatar ??
"",
width: 95.w,
),
SizedBox(width: 14.w),
head(
url: ref.userProfile?.userAvatar ?? "",
width: 95.w,
),
],
),
),
Image.asset(
"atu_images/person/at_icon_send_cp_requst_dialog_head2.png",
height: 120.w,
fit: BoxFit.fill,
),
],
),
),
Transform.translate(
offset: Offset(0, -23),
child: Container(
height: 25.w,
width: ScreenUtil().screenWidth * 0.6,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/person/at_icon_send_cp_requst_username_bg.png",
),
fit: BoxFit.fill,
),
),
child: Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: Container(
alignment: Alignment.center,
height: 15.w,
child:
(AccountStorage()
.getCurrentUser()
?.userProfile
?.userNickname
?.length ??
0) >
8
? Marquee(
text:
AccountStorage()
.getCurrentUser()
?.userProfile
?.userNickname ??
"",
style: TextStyle(
fontSize: 10.sp,
color: Color(0xffECB45C),
fontWeight: FontWeight.w600,
decoration: TextDecoration.none,
),
scrollAxis: Axis.horizontal,
crossAxisAlignment:
CrossAxisAlignment.start,
blankSpace: 20.0,
velocity: 40.0,
pauseAfterRound: Duration(seconds: 1),
accelerationDuration: Duration(seconds: 1),
accelerationCurve: Curves.linear,
decelerationDuration: Duration(
milliseconds: 500,
),
decelerationCurve: Curves.easeOut,
)
: Text(
AccountStorage()
.getCurrentUser()
?.userProfile
?.userNickname ??
"",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 10.sp,
color: Color(0xffECB45C),
fontWeight: FontWeight.w600,
decoration: TextDecoration.none,
),
),
),
),
SizedBox(width: 20.w),
Expanded(
child: Container(
alignment: Alignment.center,
height: 15.w,
child:
(ref.userProfile?.userNickname?.length ?? 0) > 8
? Marquee(
text: ref.userProfile?.userNickname ?? "",
style: TextStyle(
fontSize: 10.sp,
color: Color(0xffECB45C),
fontWeight: FontWeight.w600,
decoration: TextDecoration.none,
),
scrollAxis: Axis.horizontal,
crossAxisAlignment:
CrossAxisAlignment.start,
blankSpace: 20.0,
velocity: 40.0,
pauseAfterRound: Duration(seconds: 1),
accelerationDuration: Duration(seconds: 1),
accelerationCurve: Curves.linear,
decelerationDuration: Duration(
milliseconds: 500,
),
decelerationCurve: Curves.easeOut,
)
: Text(
ref.userProfile?.userNickname ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 10.sp,
color: Color(0xffECB45C),
fontWeight: FontWeight.w600,
decoration: TextDecoration.none,
),
),
),
),
SizedBox(width: 15.w),
],
),
),
),
Container(
padding: EdgeInsets.only(bottom: 12.w),
margin: EdgeInsets.symmetric(horizontal: 18.w),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/person/at_icon_send_cp_requst_dialog_content.png",
),
fit: BoxFit.fill,
),
),
child: Column(
children: [
Container(
margin: EdgeInsets.symmetric(
horizontal: 35.w,
).copyWith(top: 45.w),
child: text(
ATAppLocalizations.of(
context,
)!.areYouSureYouWantToPartWaysWithYourCP,
fontWeight: FontWeight.w500,
textColor: Color(0xffECB45C),
maxLines: 3,
fontSize: 14.sp,
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 20.w),
alignment: AlignmentDirectional.center,
child: text(
ATAppLocalizations.of(context)!.partWaysTips,
fontSize: 10.w,
textColor: Color(0xffECB45C),
maxLines: 6,
fontWeight: FontWeight.w500,
),
),
],
),
),
SizedBox(height: 10.w),
Row(
mainAxisSize: MainAxisSize.min,
children: [
GestureDetector(
child: Container(
padding: EdgeInsets.only(top: 7.w),
alignment: AlignmentDirectional.center,
width: 130.w,
height: 48.w,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/person/at_icon_send_cp_requst_ok_bg.png",
),
fit: BoxFit.fill,
),
),
child: text(
ATAppLocalizations.of(context)!.cancel,
fontSize: 18.sp,
fontWeight: FontWeight.bold,
textColor: Color(0xffECB45C),
),
),
onTap: () {
SmartDialog.dismiss(tag: "showPartWaysDialog");
},
),
SizedBox(width: 25.w),
GestureDetector(
child: Container(
padding: EdgeInsets.only(top: 7.w),
alignment: AlignmentDirectional.center,
width: 130.w,
height: 48.w,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/person/at_icon_send_cp_requst_cancel_bg.png",
),
fit: BoxFit.fill,
),
),
child: text(
ATAppLocalizations.of(context)!.confirm,
fontSize: 18.sp,
fontWeight: FontWeight.bold,
textColor: Color(0xffECB45C),
),
),
onTap: () {
ATLoadingManager.exhibitOperation();
AccountRepository()
.cpRelationshipDismissApply(ref.userProfile?.id ?? "")
.then((result) {
if (!mounted) return;
SmartDialog.dismiss(tag: "showPartWaysDialog");
ATTts.show(
ATAppLocalizations.of(
context,
)!.operationSuccessful,
);
ATLoadingManager.veilRoutine();
ATNavigatorUtils.popUntil(
context,
ModalRoute.withName(ATRoutes.home),
);
})
.catchError((e) {
ATLoadingManager.veilRoutine();
});
},
),
],
),
],
),
);
},
);
}
}