Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-07-23 16:47:11 +08:00
parent 148e0872b4
commit 418a1e8d39
821 changed files with 29467 additions and 25520 deletions

View File

@@ -43,18 +43,29 @@ class _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {
return Scaffold(
appBar: AppBar(title: const Text('聊天设置')),
body: ListView(
padding:
EdgeInsets.only(bottom: MediaQuery.paddingOf(context).bottom + 80),
padding: EdgeInsets.only(
bottom: MediaQuery.paddingOf(context).bottom + 80,
),
children: [
divider,
Obx(() =>
_buildUserInfo(theme, divider, _controller.userState.value)),
Obx(() => _buildSessionSs(
theme, divider, divider2, _controller.sessionSs.value)),
Obx(() => _controller.sessionSs.value.isSuccess
? _buildBlockItem(
_controller.sessionSs.value.data.followStatus == 128)
: const SizedBox.shrink()),
Obx(
() => _buildUserInfo(theme, divider, _controller.userState.value),
),
Obx(
() => _buildSessionSs(
theme,
divider,
divider2,
_controller.sessionSs.value,
),
),
Obx(
() => _controller.sessionSs.value.isSuccess
? _buildBlockItem(
_controller.sessionSs.value.data.followStatus == 128,
)
: const SizedBox.shrink(),
),
divider2,
ListTile(
dense: true,
@@ -80,8 +91,9 @@ class _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon:
WidgetStateProperty.resolveWith<Icon?>((Set<WidgetState> states) {
thumbIcon: WidgetStateProperty.resolveWith<Icon?>((
Set<WidgetState> states,
) {
if (states.isNotEmpty && states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
@@ -101,56 +113,59 @@ class _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {
) {
return switch (loadingState) {
Loading() => const SizedBox.shrink(),
Success(:var response) => response?.isNotEmpty == true
? Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Builder(
builder: (context) {
final ImUserInfosData item = response!.first;
return ListTile(
onTap: () => Get.toNamed('/member?mid=${item.mid}'),
leading: PendantAvatar(
avatar: item.face,
size: 42,
badgeSize: 14,
isVip: item.vip?.status != null && item.vip!.status > 0,
garbPendantImage: item.pendant?.image,
officialType: item.official?.type,
),
title: Text(
item.name!,
style: TextStyle(
fontSize: 14,
color: item.vip?.status != null &&
item.vip!.status > 0 &&
item.vip?.type == 2
? context.vipColor
: null,
Success(:var response) =>
response?.isNotEmpty == true
? Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Builder(
builder: (context) {
final ImUserInfosData item = response!.first;
return ListTile(
onTap: () => Get.toNamed('/member?mid=${item.mid}'),
leading: PendantAvatar(
avatar: item.face,
size: 42,
badgeSize: 14,
isVip:
item.vip?.status != null && item.vip!.status > 0,
garbPendantImage: item.pendant?.image,
officialType: item.official?.type,
),
),
subtitle: Text(
'UID: ${item.mid}${item.sign?.isNotEmpty == true ? '\n${item.sign}' : ''}',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 13,
title: Text(
item.name!,
style: TextStyle(
fontSize: 14,
color:
item.vip?.status != null &&
item.vip!.status > 0 &&
item.vip?.type == 2
? context.vipColor
: null,
),
),
subtitle: Text(
'UID: ${item.mid}${item.sign?.isNotEmpty == true ? '\n${item.sign}' : ''}',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 13,
color: theme.colorScheme.outline,
),
),
trailing: Icon(
size: 22,
Icons.keyboard_arrow_right,
color: theme.colorScheme.outline,
),
),
trailing: Icon(
size: 22,
Icons.keyboard_arrow_right,
color: theme.colorScheme.outline,
),
);
},
),
divider,
],
)
: const SizedBox.shrink(),
);
},
),
divider,
],
)
: const SizedBox.shrink(),
Error(:var errMsg) => _errWidget(errMsg, _controller.getUserInfo),
};
}
@@ -164,71 +179,75 @@ class _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {
return switch (loadingState) {
Loading() => const SizedBox.shrink(),
Success(:var response) => Builder(
builder: (context) {
late final subTitleS =
TextStyle(fontSize: 13, color: theme.colorScheme.outline);
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (response.showPushSetting == 1)
ListTile(
dense: true,
onTap: () => _controller.setPush(response.pushSetting == 0),
title: const Text('接收消息推送', style: TextStyle(fontSize: 14)),
subtitle: Text(
'若关闭此开关,你将不再收到该账号的图文消息与稿件推送,但通知类消息不受影响',
style: subTitleS,
),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>(
(Set<WidgetState> states) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: response.pushSetting == 0,
onChanged: (value) =>
_controller.setPush(response.pushSetting == 0),
),
),
builder: (context) {
late final subTitleS = TextStyle(
fontSize: 13,
color: theme.colorScheme.outline,
);
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (response.showPushSetting == 1)
ListTile(
dense: true,
onTap: () => _controller.setPush(response.pushSetting == 0),
title: const Text('接收消息推送', style: TextStyle(fontSize: 14)),
subtitle: Text(
'若关闭此开关,你将不再收到该账号的图文消息与稿件推送,但通知类消息不受影响',
style: subTitleS,
),
divider2,
Obx(
() => ListTile(
dense: true,
onTap: _controller.setPin,
title: const Text('置顶聊天', style: TextStyle(fontSize: 14)),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>(
(Set<WidgetState> states) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: _controller.isPinned.value,
onChanged: (value) => _controller.setPin(),
),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>((
Set<WidgetState> states,
) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: response.pushSetting == 0,
onChanged: (value) =>
_controller.setPush(response.pushSetting == 0),
),
),
),
divider2,
Obx(() => _buildMuteItem(_controller.msgDnd.value)),
divider,
],
);
},
),
divider2,
Obx(
() => ListTile(
dense: true,
onTap: _controller.setPin,
title: const Text('置顶聊天', style: TextStyle(fontSize: 14)),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>((
Set<WidgetState> states,
) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: _controller.isPinned.value,
onChanged: (value) => _controller.setPin(),
),
),
),
),
divider2,
Obx(() => _buildMuteItem(_controller.msgDnd.value)),
divider,
],
);
},
),
Error(:var errMsg) => _errWidget(errMsg, _controller.getSessionSs),
};
}
@@ -236,30 +255,32 @@ class _WhisperLinkSettingPageState extends State<WhisperLinkSettingPage> {
Widget _buildMuteItem(LoadingState<List<UidSetting>?> loadingState) {
return switch (loadingState) {
Loading() => const SizedBox.shrink(),
Success(:var response) => response?.isNotEmpty == true
? ListTile(
dense: true,
onTap: () => _controller.setMute(response.first.setting == 1),
title: const Text('消息免打扰', style: TextStyle(fontSize: 14)),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>(
(Set<WidgetState> states) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: response!.first.setting == 1,
onChanged: (value) =>
_controller.setMute(response.first.setting == 1),
Success(:var response) =>
response?.isNotEmpty == true
? ListTile(
dense: true,
onTap: () => _controller.setMute(response.first.setting == 1),
title: const Text('消息免打扰', style: TextStyle(fontSize: 14)),
trailing: Transform.scale(
alignment: Alignment.centerRight,
scale: 0.8,
child: Switch(
thumbIcon: WidgetStateProperty.resolveWith<Icon?>((
Set<WidgetState> states,
) {
if (states.isNotEmpty &&
states.first == WidgetState.selected) {
return const Icon(Icons.done);
}
return null;
}),
value: response!.first.setting == 1,
onChanged: (value) =>
_controller.setMute(response.first.setting == 1),
),
),
),
)
: const SizedBox.shrink(),
)
: const SizedBox.shrink(),
Error(:var errMsg) => _errWidget(errMsg, _controller.getMsgDnd),
};
}