💄 Optimize profile page

This commit is contained in:
2025-11-02 01:20:14 +08:00
parent e3c92a3c55
commit 85005ff9c3
2 changed files with 139 additions and 80 deletions

View File

@@ -54,56 +54,134 @@ class _AccountBasicInfo extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Card(
padding: const EdgeInsets.fromLTRB(24, 24, 24, 8), child: Builder(
child: Row( builder: (context) {
crossAxisAlignment: CrossAxisAlignment.start, final hasBackground = data.profile.background?.id != null;
children: [ return Column(
ProfilePictureWidget(file: data.profile.picture, radius: 32), crossAxisAlignment: CrossAxisAlignment.start,
const Gap(20), children: [
Expanded( if (isWideScreen(context) && hasBackground)
child: Column( Stack(
crossAxisAlignment: CrossAxisAlignment.stretch, clipBehavior: Clip.none,
children: [
Row(
children: [ children: [
AccountName(account: data, style: TextStyle(fontSize: 20)), ClipRRect(
const Gap(6), borderRadius: BorderRadius.only(
Flexible( topLeft: Radius.circular(8),
child: Text( topRight: Radius.circular(8),
'@${data.name}', ),
maxLines: 1, child: AspectRatio(
overflow: TextOverflow.ellipsis, aspectRatio: 16 / 7,
).fontSize(14).opacity(0.85), child: CloudImageWidget(
file: data.profile.background,
fit: BoxFit.cover,
),
),
),
Positioned(
bottom: -24,
left: 16,
child: ProfilePictureWidget(
file: data.profile.picture,
radius: 32,
),
), ),
], ],
), ),
if (accountDeveloper.value != null) Builder(
Row( builder: (context) {
spacing: 7, final showBackground = isWideScreen(context) && hasBackground;
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
spacing: showBackground ? 0 : 20,
children: [ children: [
const Icon(Symbols.smart_toy, size: 18), if (!showBackground)
Text( ProfilePictureWidget(
'botAutomatedBy'.tr( file: data.profile.picture,
args: [accountDeveloper.value!.publisher!.nick], radius: 32,
), ),
).fontSize(13), Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
spacing: 4,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Flexible(
child: AccountName(
account: data,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
if (isWideScreen(context))
Flexible(
child: Text(
'@${data.name}',
).fontSize(11).padding(bottom: 2.5),
),
],
),
if (!isWideScreen(context))
Text(
'@${data.name}',
).fontSize(11).padding(bottom: 2.5),
Text(
(data.profile.bio.isNotEmpty)
? data.profile.bio
: 'descriptionNone'.tr(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
if (accountDeveloper.value != null)
Row(
spacing: 7,
children: [
const Icon(Symbols.smart_toy, size: 18),
Text(
'botAutomatedBy'.tr(
args: [
accountDeveloper.value!.publisher!.nick,
],
),
).fontSize(13),
],
).opacity(0.75).padding(top: 4),
const Gap(4),
AccountStatusWidget(
uname: uname,
padding: EdgeInsets.zero,
),
const Gap(8),
],
),
),
IconButton(
onPressed: () {
SharePlus.instance.share(
ShareParams(
uri: Uri.parse(
'https://solian.app/@${data.name}',
),
),
);
},
icon: const Icon(Symbols.share),
),
], ],
).opacity(0.75), ).padding(
const Gap(4), left: 16,
AccountStatusWidget(uname: uname, padding: EdgeInsets.zero), right: 16,
], top: 16 + (showBackground ? 16 : 0),
), );
), },
IconButton( ),
onPressed: () { ],
SharePlus.instance.share( );
ShareParams(uri: Uri.parse('https://solian.app/@${data.name}')), },
);
},
icon: const Icon(Symbols.share),
),
],
), ),
); );
} }
@@ -764,33 +842,14 @@ class AccountProfileScreen extends HookConsumerWidget {
color: appbarColor.value, color: appbarColor.value,
shadows: [appbarShadow], shadows: [appbarShadow],
), ),
flexibleSpace: Stack( title: Text(
children: [ data.nick,
Positioned.fill( style: TextStyle(
child: color:
data.profile.background?.id != null appbarColor.value ??
? CloudImageWidget( Theme.of(context).appBarTheme.foregroundColor,
file: data.profile.background, shadows: [appbarShadow],
) ),
: Container(
color:
Theme.of(
context,
).appBarTheme.backgroundColor,
),
),
FlexibleSpaceBar(
title: Text(
data.nick,
style: TextStyle(
color:
appbarColor.value ??
Theme.of(context).appBarTheme.foregroundColor,
shadows: [appbarShadow],
),
),
),
],
), ),
) )
: null, : null,
@@ -806,7 +865,7 @@ class AccountProfileScreen extends HookConsumerWidget {
data: data, data: data,
uname: name, uname: name,
accountDeveloper: accountDeveloper, accountDeveloper: accountDeveloper,
), ).padding(horizontal: 4, top: 20),
), ),
if (data.badges.isNotEmpty) if (data.badges.isNotEmpty)
SliverToBoxAdapter( SliverToBoxAdapter(
@@ -857,7 +916,12 @@ class AccountProfileScreen extends HookConsumerWidget {
Flexible( Flexible(
child: CustomScrollView( child: CustomScrollView(
slivers: [ slivers: [
SliverGap(24), SliverGap(18),
SliverToBoxAdapter(
child: ActivityPresenceWidget(
uname: name,
).padding(horizontal: 4, top: 4, bottom: 4),
),
SliverToBoxAdapter( SliverToBoxAdapter(
child: _AccountPublisherList( child: _AccountPublisherList(
publishers: accountPublishers.value ?? [], publishers: accountPublishers.value ?? [],
@@ -883,11 +947,6 @@ class AccountProfileScreen extends HookConsumerWidget {
), ),
), ),
), ),
SliverToBoxAdapter(
child: ActivityPresenceWidget(
uname: name,
).padding(horizontal: 4, top: 4, bottom: 8),
),
], ],
), ),
), ),
@@ -939,7 +998,7 @@ class AccountProfileScreen extends HookConsumerWidget {
data: data, data: data,
uname: name, uname: name,
accountDeveloper: accountDeveloper, accountDeveloper: accountDeveloper,
), ).padding(horizontal: 4, top: 8),
), ),
if (data.badges.isNotEmpty) if (data.badges.isNotEmpty)
SliverToBoxAdapter( SliverToBoxAdapter(

View File

@@ -256,7 +256,7 @@ class ActivityPresenceWidget extends ConsumerWidget {
children: [ children: [
Text( Text(
'activities', 'activities',
).tr().bold().padding(horizontal: 8, vertical: 4), ).tr().bold().padding(horizontal: 16, vertical: 4),
if (activities.isEmpty) if (activities.isEmpty)
Row( Row(
spacing: 4, spacing: 4,
@@ -264,7 +264,7 @@ class ActivityPresenceWidget extends ConsumerWidget {
const Icon(Symbols.inbox, size: 16), const Icon(Symbols.inbox, size: 16),
Text('dataEmpty').tr().fontSize(13), Text('dataEmpty').tr().fontSize(13),
], ],
).opacity(0.75).padding(horizontal: 8), ).opacity(0.75).padding(horizontal: 16, bottom: 8),
...activities.map((activity) { ...activities.map((activity) {
final dcImages = _buildDiscordImages(ref, activity); final dcImages = _buildDiscordImages(ref, activity);