feat: suporte a tabelas markdown nas legendas, remoção de borda de imagens e separação de comentários no mural
Some checks failed
Main Deploy Workflow / deploy_web (push) Has been cancelled
Main Deploy Workflow / deploy_playstore_internal (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled

This commit is contained in:
2026-09-15 17:24:18 -03:00
parent 43e0dc177c
commit ab8637bf6a
6 changed files with 157 additions and 32 deletions

View File

@@ -0,0 +1,86 @@
// SPDX-FileCopyrightText: 2019-Present Christian Kußowski
// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat
//
// SPDX-License-Identifier: AGPL-3.0-or-later
import 'package:material_ui/material_ui.dart';
import 'package:tatchat/config/setting_keys.dart';
import 'package:tatchat/l10n/l10n.dart';
import 'package:tatchat/utils/platform_infos.dart';
import 'package:tatchat/widgets/adaptive_dialogs/adaptive_dialog_action.dart';
import 'package:tatchat/widgets/adaptive_dialogs/dialog_text_field.dart';
Future<String?> showEditMediaCaptionDialog(
BuildContext context, {
required String initialCaption,
}) => showDialog<String>(
context: context,
builder: (context) => EditMediaCaptionDialog(initialCaption: initialCaption),
);
class EditMediaCaptionDialog extends StatefulWidget {
final String initialCaption;
const EditMediaCaptionDialog({super.key, required this.initialCaption});
@override
State<EditMediaCaptionDialog> createState() => _EditMediaCaptionDialogState();
}
class _EditMediaCaptionDialogState extends State<EditMediaCaptionDialog> {
late final TextEditingController _controller = TextEditingController(
text: widget.initialCaption,
);
late final FocusNode _focusNode = FocusNode();
@override
void dispose() {
_focusNode.dispose();
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final isMobile = PlatformInfos.isMobile;
final l10n = L10n.of(context);
return AlertDialog.adaptive(
title: Text(l10n.editCaption),
insetPadding: isMobile
? const EdgeInsets.all(8.0)
: const EdgeInsets.symmetric(horizontal: 40, vertical: 24),
constraints: isMobile
? const BoxConstraints(
maxWidth: double.infinity,
maxHeight: double.infinity,
)
: null,
content: SizedBox(
width: 512,
height: isMobile ? MediaQuery.sizeOf(context).height * 0.7 : null,
child: DialogTextField(
controller: _controller,
focusNode: _focusNode,
hintText: l10n.captionHint,
labelText: l10n.optionalMessage,
keyboardType: TextInputType.multiline,
minLines: isMobile ? 8 : 3,
maxLines: isMobile ? null : 8,
maxLength: AppSettings.textMessageMaxLength.value,
counterText: '',
),
),
actions: [
AdaptiveDialogAction(
onPressed: () => Navigator.of(context).pop(),
child: Text(l10n.cancel),
),
AdaptiveDialogAction(
autofocus: true,
onPressed: () => Navigator.of(context).pop(_controller.text.trim()),
child: Text(l10n.save),
),
],
);
}
}