💄 Optimize post editors

This commit is contained in:
2025-02-07 22:35:04 +08:00
parent a2d2ce4d38
commit fe028860e9
7 changed files with 241 additions and 239 deletions

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:provider/provider.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:surface/providers/sn_network.dart';
@ -96,10 +98,14 @@ class _AccountSelectState extends State<AccountSelect> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.title,
style: Theme.of(context).textTheme.headlineSmall,
).padding(left: 24, right: 24, top: 16, bottom: 16),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Icon(Symbols.group, size: 24),
const Gap(16),
Text(widget.title, style: Theme.of(context).textTheme.titleLarge),
],
).padding(horizontal: 20, top: 16, bottom: 12),
Container(
color: Theme.of(context).colorScheme.secondaryContainer,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),

View File

@ -336,6 +336,7 @@ class ChatMessageInputState extends State<ChatMessageInput> {
: 'fieldChatMessage'.tr(args: [widget.controller.channel?.name ?? 'loading'.tr()]),
border: InputBorder.none,
),
textInputAction: TextInputAction.send,
onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(),
onSubmitted: (_) {
if (_isBusy) return;

View File

@ -833,7 +833,7 @@ class _PostContentHeader extends StatelessWidget {
onTap: () {
showModalBottomSheet(
context: context,
builder: (context) => _PostGetInsightSheet(postId: data.id),
builder: (context) => _PostGetInsightPopup(postId: data.id),
);
},
),
@ -1292,16 +1292,16 @@ class _PostAbuseReportDialogState extends State<_PostAbuseReportDialog> {
}
}
class _PostGetInsightSheet extends StatefulWidget {
class _PostGetInsightPopup extends StatefulWidget {
final int postId;
const _PostGetInsightSheet({required this.postId});
const _PostGetInsightPopup({required this.postId});
@override
State<_PostGetInsightSheet> createState() => _PostGetInsightSheetState();
State<_PostGetInsightPopup> createState() => _PostGetInsightPopupState();
}
class _PostGetInsightSheetState extends State<_PostGetInsightSheet> {
class _PostGetInsightPopupState extends State<_PostGetInsightPopup> {
String? _response;
String? _thinkingProcess;

View File

@ -292,7 +292,7 @@ class PostMediaPendingList extends StatelessWidget {
constraints: const BoxConstraints(maxHeight: 120),
child: Row(
children: [
const Gap(8),
const Gap(16),
if (thumbnail != null)
ContextMenuArea(
contextMenu: _createContextMenu(context, -1, thumbnail!),
@ -337,15 +337,10 @@ class _PostMediaPendingItem extends StatelessWidget {
final sn = context.read<SnNetworkProvider>();
return Container(
decoration: BoxDecoration(
border: Border.all(
color: Theme.of(context).dividerColor,
width: 1,
),
borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.surfaceContainer,
),
return Material(
elevation: 4,
color: Theme.of(context).colorScheme.surfaceContainer,
borderRadius: BorderRadius.circular(8),
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)),
child: Row(

View File

@ -19,6 +19,7 @@ const Map<int, String> kPostVisibilityLevel = {
class PostMetaEditor extends StatelessWidget {
final PostWriteController controller;
const PostMetaEditor({super.key, required this.controller});
Future<DateTime?> _selectDate(
@ -87,26 +88,14 @@ class PostMetaEditor extends StatelessWidget {
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom + 8),
child: Column(
children: [
TextField(
controller: controller.titleController,
decoration: InputDecoration(
labelText: 'fieldPostTitle'.tr(),
border: UnderlineInputBorder(),
),
onTapOutside: (_) =>
FocusManager.instance.primaryFocus?.unfocus(),
).padding(horizontal: 24),
if (controller.mode == 'articles') const Gap(4),
if (controller.mode == 'articles')
if (controller.mode == 'stories')
TextField(
controller: controller.descriptionController,
maxLines: null,
controller: controller.titleController,
decoration: InputDecoration(
labelText: 'fieldPostDescription'.tr(),
labelText: 'fieldPostTitle'.tr(),
border: UnderlineInputBorder(),
),
onTapOutside: (_) =>
FocusManager.instance.primaryFocus?.unfocus(),
onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(),
).padding(horizontal: 24),
const Gap(4),
PostTagsField(
@ -133,8 +122,7 @@ class PostMetaEditor extends StatelessWidget {
helperMaxLines: 2,
border: UnderlineInputBorder(),
),
onTapOutside: (_) =>
FocusManager.instance.primaryFocus?.unfocus(),
onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(),
).padding(horizontal: 24),
const Gap(12),
ListTile(
@ -182,8 +170,7 @@ class PostMetaEditor extends StatelessWidget {
leading: Icon(Symbols.person),
trailing: Icon(Symbols.chevron_right),
title: Text('postVisibleUsers').tr(),
subtitle: Text('postSelectedUsers')
.plural(controller.visibleUsers.length),
subtitle: Text('postSelectedUsers').plural(controller.visibleUsers.length),
onTap: () {
_selectVisibleUser(context);
},
@ -194,8 +181,7 @@ class PostMetaEditor extends StatelessWidget {
leading: Icon(Symbols.person),
trailing: Icon(Symbols.chevron_right),
title: Text('postInvisibleUsers').tr(),
subtitle: Text('postSelectedUsers')
.plural(controller.invisibleUsers.length),
subtitle: Text('postSelectedUsers').plural(controller.invisibleUsers.length),
onTap: () {
_selectInvisibleUser(context);
},
@ -204,9 +190,7 @@ class PostMetaEditor extends StatelessWidget {
leading: const Icon(Symbols.event_available),
title: Text('postPublishedAt').tr(),
subtitle: Text(
controller.publishedAt != null
? dateFormatter.format(controller.publishedAt!)
: 'unset'.tr(),
controller.publishedAt != null ? dateFormatter.format(controller.publishedAt!) : 'unset'.tr(),
),
trailing: controller.publishedAt != null
? IconButton(
@ -230,9 +214,7 @@ class PostMetaEditor extends StatelessWidget {
leading: const Icon(Symbols.event_busy),
title: Text('postPublishedUntil').tr(),
subtitle: Text(
controller.publishedUntil != null
? dateFormatter.format(controller.publishedUntil!)
: 'unset'.tr(),
controller.publishedUntil != null ? dateFormatter.format(controller.publishedUntil!) : 'unset'.tr(),
),
trailing: controller.publishedUntil != null
? IconButton(