💄 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:hooks_riverpod/hooks_riverpod.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/alert.dart';
import 'package:island/widgets/app_scaffold.dart';
@@ -99,7 +100,10 @@ class RelationshipListTile extends StatelessWidget {
return ListTile(
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(
spacing: 6,
children: [

View File

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

View File

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

View File

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