💄 Optimize publisher page
This commit is contained in:
@@ -344,7 +344,7 @@
|
|||||||
"accountSettingsHelpContent": "此页面允许您管理您的帐户安全性、隐私和其他设置。如果您需要帮助,请联系管理员。",
|
"accountSettingsHelpContent": "此页面允许您管理您的帐户安全性、隐私和其他设置。如果您需要帮助,请联系管理员。",
|
||||||
"unauthorized": "未授权",
|
"unauthorized": "未授权",
|
||||||
"unauthorizedHint": "您未登录或会话已过期,请重新登录。",
|
"unauthorizedHint": "您未登录或会话已过期,请重新登录。",
|
||||||
"publisherBelongsTo": "属于",
|
"publisherBelongsTo": "属于 {}",
|
||||||
"postContent": "内容",
|
"postContent": "内容",
|
||||||
"postSettings": "设置",
|
"postSettings": "设置",
|
||||||
"postPublisherUnselected": "未指定发布者",
|
"postPublisherUnselected": "未指定发布者",
|
||||||
|
|||||||
@@ -1042,6 +1042,11 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
data: data,
|
data: data,
|
||||||
).padding(horizontal: 4),
|
).padding(horizontal: 4),
|
||||||
),
|
),
|
||||||
|
SliverToBoxAdapter(
|
||||||
|
child: ActivityPresenceWidget(
|
||||||
|
uname: name,
|
||||||
|
).padding(horizontal: 8, top: 4, bottom: 4),
|
||||||
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: _AccountPublisherList(
|
child: _AccountPublisherList(
|
||||||
publishers: accountPublishers.value ?? [],
|
publishers: accountPublishers.value ?? [],
|
||||||
@@ -1071,11 +1076,6 @@ class AccountProfileScreen extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
).padding(horizontal: 4),
|
).padding(horizontal: 4),
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
|
||||||
child: ActivityPresenceWidget(
|
|
||||||
uname: name,
|
|
||||||
).padding(horizontal: 8, top: 4, bottom: 8),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -46,121 +46,178 @@ class _PublisherBasisWidget extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Row(
|
return Card(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
child: Builder(
|
||||||
spacing: 20,
|
builder: (context) {
|
||||||
children: [
|
final hasBackground = data.background?.id != null;
|
||||||
GestureDetector(
|
return Column(
|
||||||
child: Badge(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
isLabelVisible: data.type == 0,
|
|
||||||
padding: EdgeInsets.all(4),
|
|
||||||
label: Icon(
|
|
||||||
Symbols.launch,
|
|
||||||
size: 16,
|
|
||||||
color: Theme.of(context).colorScheme.onPrimary,
|
|
||||||
),
|
|
||||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
|
||||||
offset: Offset(0, 48),
|
|
||||||
child: ProfilePictureWidget(
|
|
||||||
file: data.picture,
|
|
||||||
radius: 32,
|
|
||||||
borderRadius: data.type == 0 ? null : 12,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
if (data.account?.name != null) {
|
|
||||||
Navigator.pop(context, true);
|
|
||||||
context.pushNamed(
|
|
||||||
'accountProfile',
|
|
||||||
pathParameters: {'name': data.account!.name},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
||||||
children: [
|
children: [
|
||||||
Row(
|
if (isWideScreen(context) && hasBackground)
|
||||||
spacing: 6,
|
Stack(
|
||||||
children: [
|
clipBehavior: Clip.none,
|
||||||
Text(data.nick).fontSize(20),
|
|
||||||
if (data.verification != null)
|
|
||||||
VerificationMark(mark: data.verification!),
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
'@${data.name}',
|
|
||||||
maxLines: 1,
|
|
||||||
overflow: TextOverflow.ellipsis,
|
|
||||||
).fontSize(14).opacity(0.85),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
if (data.type == 0 && data.account != null)
|
|
||||||
Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
spacing: 6,
|
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
ClipRRect(
|
||||||
data.type == 0 ? Symbols.person : Symbols.workspaces,
|
borderRadius: BorderRadius.only(
|
||||||
fill: 1,
|
topLeft: Radius.circular(8),
|
||||||
size: 17,
|
topRight: Radius.circular(8),
|
||||||
),
|
),
|
||||||
Text(
|
child: AspectRatio(
|
||||||
'publisherBelongsTo'.tr(args: ['@${data.account!.name}']),
|
aspectRatio: 16 / 7,
|
||||||
).fontSize(14),
|
child: CloudImageWidget(
|
||||||
],
|
file: data.background,
|
||||||
).opacity(0.85),
|
fit: BoxFit.cover,
|
||||||
const Gap(4),
|
|
||||||
if (data.type == 0 && data.account != null)
|
|
||||||
AccountStatusWidget(
|
|
||||||
uname: data.account!.name,
|
|
||||||
padding: EdgeInsets.zero,
|
|
||||||
),
|
|
||||||
subStatus
|
|
||||||
.when(
|
|
||||||
data:
|
|
||||||
(status) => FilledButton.icon(
|
|
||||||
onPressed:
|
|
||||||
subscribing.value
|
|
||||||
? null
|
|
||||||
: (status.isSubscribed
|
|
||||||
? unsubscribe
|
|
||||||
: subscribe),
|
|
||||||
icon: Icon(
|
|
||||||
status.isSubscribed
|
|
||||||
? Symbols.remove_circle
|
|
||||||
: Symbols.add_circle,
|
|
||||||
),
|
|
||||||
label:
|
|
||||||
Text(
|
|
||||||
status.isSubscribed
|
|
||||||
? 'unsubscribe'
|
|
||||||
: 'subscribe',
|
|
||||||
).tr(),
|
|
||||||
style: ButtonStyle(
|
|
||||||
visualDensity: VisualDensity(vertical: -2),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
error: (_, _) => const SizedBox(),
|
),
|
||||||
loading:
|
),
|
||||||
() => const SizedBox(
|
Positioned(
|
||||||
height: 36,
|
bottom: -24,
|
||||||
child: Center(
|
left: 16,
|
||||||
child: SizedBox(
|
child: ProfilePictureWidget(
|
||||||
width: 20,
|
file: data.picture,
|
||||||
height: 20,
|
radius: 32,
|
||||||
child: CircularProgressIndicator(strokeWidth: 2),
|
borderRadius: data.type == 0 ? null : 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Builder(
|
||||||
|
builder: (context) {
|
||||||
|
final showBackground = isWideScreen(context) && hasBackground;
|
||||||
|
return Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
spacing: showBackground ? 0 : 20,
|
||||||
|
children: [
|
||||||
|
if (!showBackground)
|
||||||
|
GestureDetector(
|
||||||
|
child: Badge(
|
||||||
|
isLabelVisible: data.type == 0,
|
||||||
|
padding: EdgeInsets.all(4),
|
||||||
|
label: Icon(
|
||||||
|
Symbols.launch,
|
||||||
|
size: 16,
|
||||||
|
color: Theme.of(context).colorScheme.onPrimary,
|
||||||
|
),
|
||||||
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||||
|
offset: Offset(0, 48),
|
||||||
|
child: ProfilePictureWidget(
|
||||||
|
file: data.picture,
|
||||||
|
radius: 32,
|
||||||
|
borderRadius: data.type == 0 ? null : 12,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
onTap: () {
|
||||||
|
if (data.account?.name != null) {
|
||||||
|
Navigator.pop(context, true);
|
||||||
|
context.pushNamed(
|
||||||
|
'accountProfile',
|
||||||
|
pathParameters: {'name': data.account!.name},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
),
|
),
|
||||||
)
|
Expanded(
|
||||||
.padding(top: 8),
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
spacing: 6,
|
||||||
|
children: [
|
||||||
|
Text(data.nick).fontSize(20),
|
||||||
|
if (data.verification != null)
|
||||||
|
VerificationMark(mark: data.verification!),
|
||||||
|
if (isWideScreen(context))
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'@${data.name}',
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
).fontSize(14).opacity(0.85),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (!isWideScreen(context))
|
||||||
|
Text(
|
||||||
|
'@${data.name}',
|
||||||
|
maxLines: 1,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
).fontSize(14).opacity(0.85).padding(top: 4),
|
||||||
|
if (data.type == 0 && data.account != null)
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
spacing: 6,
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
data.type == 0 ? Symbols.person : Symbols.workspaces,
|
||||||
|
fill: 1,
|
||||||
|
size: 17,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
'publisherBelongsTo'.tr(args: ['@${data.account!.name}']),
|
||||||
|
).fontSize(14),
|
||||||
|
],
|
||||||
|
).opacity(0.85),
|
||||||
|
const Gap(4),
|
||||||
|
if (data.type == 0 && data.account != null)
|
||||||
|
AccountStatusWidget(
|
||||||
|
uname: data.account!.name,
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
),
|
||||||
|
subStatus
|
||||||
|
.when(
|
||||||
|
data:
|
||||||
|
(status) => FilledButton.icon(
|
||||||
|
onPressed:
|
||||||
|
subscribing.value
|
||||||
|
? null
|
||||||
|
: (status.isSubscribed
|
||||||
|
? unsubscribe
|
||||||
|
: subscribe),
|
||||||
|
icon: Icon(
|
||||||
|
status.isSubscribed
|
||||||
|
? Symbols.remove_circle
|
||||||
|
: Symbols.add_circle,
|
||||||
|
),
|
||||||
|
label:
|
||||||
|
Text(
|
||||||
|
status.isSubscribed
|
||||||
|
? 'unsubscribe'
|
||||||
|
: 'subscribe',
|
||||||
|
).tr(),
|
||||||
|
style: ButtonStyle(
|
||||||
|
visualDensity: VisualDensity(vertical: -2),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
error: (_, _) => const SizedBox(),
|
||||||
|
loading:
|
||||||
|
() => const SizedBox(
|
||||||
|
height: 36,
|
||||||
|
child: Center(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 20,
|
||||||
|
height: 20,
|
||||||
|
child: CircularProgressIndicator(strokeWidth: 2),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.padding(vertical: 8),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).padding(
|
||||||
|
left: 16,
|
||||||
|
right: 16,
|
||||||
|
top: 16 + (showBackground ? 16 : 0),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
);
|
||||||
),
|
},
|
||||||
],
|
),
|
||||||
).padding(horizontal: 24, top: 24);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,35 +457,14 @@ class PublisherProfileScreen 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.background?.id != null
|
appbarColor.value ??
|
||||||
? CloudImageWidget(file: data.background)
|
Theme.of(context).appBarTheme.foregroundColor,
|
||||||
: Container(
|
shadows: [appbarShadow],
|
||||||
color:
|
),
|
||||||
Theme.of(
|
|
||||||
context,
|
|
||||||
).appBarTheme.backgroundColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
FlexibleSpaceBar(
|
|
||||||
title: Text(
|
|
||||||
data.nick,
|
|
||||||
style: TextStyle(
|
|
||||||
color:
|
|
||||||
appbarColor.value ??
|
|
||||||
Theme.of(
|
|
||||||
context,
|
|
||||||
).appBarTheme.foregroundColor,
|
|
||||||
shadows: [appbarShadow],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
background:
|
|
||||||
Container(), // Empty container since background is handled by Stack
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
@@ -477,7 +513,7 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
subscribing: subscribing,
|
subscribing: subscribing,
|
||||||
subscribe: subscribe,
|
subscribe: subscribe,
|
||||||
unsubscribe: unsubscribe,
|
unsubscribe: unsubscribe,
|
||||||
).padding(bottom: 8),
|
).padding(horizontal: 4, top: 20),
|
||||||
_PublisherBadgesWidget(
|
_PublisherBadgesWidget(
|
||||||
data: data,
|
data: data,
|
||||||
badges: badges,
|
badges: badges,
|
||||||
@@ -487,7 +523,7 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
_PublisherHeatmapWidget(
|
_PublisherHeatmapWidget(
|
||||||
heatmap: heatmap,
|
heatmap: heatmap,
|
||||||
forceDense: true,
|
forceDense: true,
|
||||||
),
|
).padding(vertical: 4),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -545,7 +581,7 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
subscribing: subscribing,
|
subscribing: subscribing,
|
||||||
subscribe: subscribe,
|
subscribe: subscribe,
|
||||||
unsubscribe: unsubscribe,
|
unsubscribe: unsubscribe,
|
||||||
).padding(bottom: 8),
|
).padding(horizontal: 4, top: 8),
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: _PublisherBadgesWidget(
|
child: _PublisherBadgesWidget(
|
||||||
@@ -560,7 +596,7 @@ class PublisherProfileScreen extends HookConsumerWidget {
|
|||||||
child: _PublisherBioWidget(data: data),
|
child: _PublisherBioWidget(data: data),
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
child: _PublisherHeatmapWidget(heatmap: heatmap),
|
child: _PublisherHeatmapWidget(heatmap: heatmap).padding(vertical: 4),
|
||||||
),
|
),
|
||||||
SliverPostList(pubName: name, pinned: true),
|
SliverPostList(pubName: name, pinned: true),
|
||||||
SliverToBoxAdapter(
|
SliverToBoxAdapter(
|
||||||
|
|||||||
Reference in New Issue
Block a user