💄 Optimize profile page
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user