💄 Optimize of account profile card

This commit is contained in:
2025-09-01 21:37:59 +08:00
parent 300541f9bb
commit f2d780b48f
4 changed files with 74 additions and 32 deletions

View File

@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/pods/userinfo.dart'; import 'package:island/pods/userinfo.dart';
import 'package:island/widgets/account/account_pfc.dart';
import 'package:island/widgets/account/account_picker.dart'; import 'package:island/widgets/account/account_picker.dart';
import 'package:island/widgets/alert.dart'; import 'package:island/widgets/alert.dart';
import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/app_scaffold.dart';
@@ -99,7 +100,10 @@ class RelationshipListTile extends StatelessWidget {
return ListTile( return ListTile(
contentPadding: const EdgeInsets.only(left: 16, right: 12), contentPadding: const EdgeInsets.only(left: 16, right: 12),
leading: ProfilePictureWidget(fileId: account.profile.picture?.id), leading: AccountPfcGestureDetector(
uname: account.name,
child: ProfilePictureWidget(fileId: account.profile.picture?.id),
),
title: Row( title: Row(
spacing: 6, spacing: 6,
children: [ children: [

View File

@@ -153,7 +153,9 @@ class ChatDetailScreen extends HookConsumerWidget {
), ),
ListTile( ListTile(
title: const Text('chatBreak5m').tr(), title: const Text('chatBreak5m').tr(),
subtitle: const Text('chatBreakHour').tr(args: ['chatBreak5m'.tr()]), subtitle: const Text(
'chatBreakHour',
).tr(args: ['chatBreak5m'.tr()]),
leading: const Icon(Symbols.circle), leading: const Icon(Symbols.circle),
onTap: () { onTap: () {
setChatBreak(now.add(const Duration(minutes: 5))); setChatBreak(now.add(const Duration(minutes: 5)));
@@ -165,7 +167,9 @@ class ChatDetailScreen extends HookConsumerWidget {
), ),
ListTile( ListTile(
title: const Text('chatBreak10m').tr(), title: const Text('chatBreak10m').tr(),
subtitle: const Text('chatBreakHour').tr(args: ['chatBreak10m'.tr()]), subtitle: const Text(
'chatBreakHour',
).tr(args: ['chatBreak10m'.tr()]),
leading: const Icon(Symbols.circle), leading: const Icon(Symbols.circle),
onTap: () { onTap: () {
setChatBreak(now.add(const Duration(minutes: 10))); setChatBreak(now.add(const Duration(minutes: 10)));
@@ -177,7 +181,9 @@ class ChatDetailScreen extends HookConsumerWidget {
), ),
ListTile( ListTile(
title: const Text('chatBreak15m').tr(), title: const Text('chatBreak15m').tr(),
subtitle: const Text('chatBreakHour').tr(args: ['chatBreak15m'.tr()]), subtitle: const Text(
'chatBreakHour',
).tr(args: ['chatBreak15m'.tr()]),
leading: const Icon(Symbols.timer_3), leading: const Icon(Symbols.timer_3),
onTap: () { onTap: () {
setChatBreak(now.add(const Duration(minutes: 15))); setChatBreak(now.add(const Duration(minutes: 15)));
@@ -189,7 +195,9 @@ class ChatDetailScreen extends HookConsumerWidget {
), ),
ListTile( ListTile(
title: const Text('chatBreak30m').tr(), title: const Text('chatBreak30m').tr(),
subtitle: const Text('chatBreakHour').tr(args: ['chatBreak30m'.tr()]), subtitle: const Text(
'chatBreakHour',
).tr(args: ['chatBreak30m'.tr()]),
leading: const Icon(Symbols.timer), leading: const Icon(Symbols.timer),
onTap: () { onTap: () {
setChatBreak(now.add(const Duration(minutes: 30))); setChatBreak(now.add(const Duration(minutes: 30)));
@@ -247,7 +255,10 @@ class ChatDetailScreen extends HookConsumerWidget {
return AppScaffold( return AppScaffold(
body: roomState.when( body: roomState.when(
loading: () => const Center(child: CircularProgressIndicator()), loading: () => const Center(child: CircularProgressIndicator()),
error: (error, _) => Center(child: Text('errorGeneric'.tr(args: [error.toString()]))), error:
(error, _) => Center(
child: Text('errorGeneric'.tr(args: [error.toString()])),
),
data: data:
(currentRoom) => CustomScrollView( (currentRoom) => CustomScrollView(
slivers: [ slivers: [
@@ -375,12 +386,26 @@ class ChatDetailScreen extends HookConsumerWidget {
trailing: const Icon(Symbols.chevron_right), trailing: const Icon(Symbols.chevron_right),
title: const Text('searchMessages').tr(), title: const Text('searchMessages').tr(),
subtitle: totalMessages.when( subtitle: totalMessages.when(
data: (count) => Text('messagesCount'.tr(args: [count.toString()])), data:
loading: () => const CircularProgressIndicator(), (count) => Text(
error: (err, stack) => Text('errorGeneric'.tr(args: [err.toString()])), 'messagesCount'.tr(
args: [count.toString()],
),
),
loading:
() => const CircularProgressIndicator(),
error:
(err, stack) => Text(
'errorGeneric'.tr(
args: [err.toString()],
),
),
), ),
onTap: () { onTap: () {
context.pushNamed('searchMessages', pathParameters: {'id': id}); context.pushNamed(
'searchMessages',
pathParameters: {'id': id},
);
}, },
), ),
], ],
@@ -716,7 +741,7 @@ class _ChatMemberListSheet extends HookConsumerWidget {
? 'permissionModerator' ? 'permissionModerator'
: 'permissionMember', : 'permissionMember',
).tr(), ).tr(),
Text('dotSeparator').bold().padding(horizontal: 6), Text('·').bold().padding(horizontal: 6),
Expanded(child: Text("@${member.account.name}")), Expanded(child: Text("@${member.account.name}")),
], ],
), ),

View File

@@ -162,7 +162,7 @@ class VerificationStatusCard extends StatelessWidget {
size: 32, size: 32,
color: kVerificationMarkColors[mark.type], color: kVerificationMarkColors[mark.type],
fill: 1, fill: 1,
), ).alignment(Alignment.centerLeft),
const Gap(8), const Gap(8),
Text(mark.title ?? 'No title').bold(), Text(mark.title ?? 'No title').bold(),
Text(mark.description ?? 'descriptionNone'.tr()), Text(mark.description ?? 'descriptionNone'.tr()),

View File

@@ -111,7 +111,10 @@ class AccountProfileCard extends HookConsumerWidget {
], ],
), ),
if (data.profile.timeZone.isNotEmpty && !kIsWeb) if (data.profile.timeZone.isNotEmpty && !kIsWeb)
Row( () {
try {
final tzInfo = getTzInfo(data.profile.timeZone);
return Row(
spacing: 6, spacing: 6,
children: [ children: [
Icon( Icon(
@@ -120,17 +123,27 @@ class AccountProfileCard extends HookConsumerWidget {
fill: 1, fill: 1,
).padding(right: 2), ).padding(right: 2),
Text( Text(
getTzInfo( tzInfo.$2.formatCustomGlobal('HH:mm'),
data.profile.timeZone,
).$2.formatCustomGlobal('HH:mm'),
).fontSize(12), ).fontSize(12),
Text( Text(
getTzInfo( tzInfo.$1.formatOffsetLocal(),
data.profile.timeZone,
).$1.formatOffsetLocal(),
).fontSize(12), ).fontSize(12),
], ],
).padding(top: 2), ).padding(top: 2);
} catch (e) {
return Row(
spacing: 6,
children: [
Icon(
Symbols.alarm,
size: 17,
fill: 1,
).padding(right: 2),
Text('timezoneNotFound'.tr()).fontSize(12),
],
).padding(top: 2);
}
}(),
if (data.badges.isNotEmpty) if (data.badges.isNotEmpty)
BadgeList(badges: data.badges).padding(top: 12), BadgeList(badges: data.badges).padding(top: 12),
LevelingProgressCard( LevelingProgressCard(