move part of the functionality to EditorController for clutter reduction

This commit is contained in:
Filip Krawczyk 2022-08-25 23:46:43 +02:00
parent c15cfdf02c
commit 2d7d2a64bd
5 changed files with 61 additions and 61 deletions

View File

@ -30,8 +30,10 @@ class CreatePostPage extends HookWidget {
useStore((CreatePostStore store) => store.instanceHost), useStore((CreatePostStore store) => store.instanceHost),
); );
final editorController = useEditorController(
instanceHost: context.read<CreatePostStore>().instanceHost,
text: context.read<CreatePostStore>().body);
final titleFocusNode = useFocusNode(); final titleFocusNode = useFocusNode();
final editorFocusNode = useFocusNode();
handleSubmit(Jwt token) async { handleSubmit(Jwt token) async {
if (formKey.currentState!.validate()) { if (formKey.currentState!.validate()) {
@ -54,17 +56,12 @@ class CreatePostPage extends HookWidget {
), ),
); );
final bodyController =
useTextEditingController(text: context.read<CreatePostStore>().body);
final body = ObserverBuilder<CreatePostStore>( final body = ObserverBuilder<CreatePostStore>(
builder: (context, store) => Editor( builder: (context, store) => Editor(
controller: bodyController, controller: editorController,
onChanged: (body) => store.body = body, onChanged: (body) => store.body = body,
labelText: L10n.of(context).body, labelText: L10n.of(context).body,
instanceHost: store.instanceHost,
fancy: store.showFancy, fancy: store.showFancy,
focusNode: editorFocusNode,
), ),
); );
@ -143,11 +140,7 @@ class CreatePostPage extends HookWidget {
), ),
), ),
BottomSticky( BottomSticky(
child: EditorToolbar( child: EditorToolbar(editorController),
editorFocusNode: editorFocusNode,
controller: bodyController,
instanceHost: context.read<CreatePostStore>().instanceHost,
),
), ),
], ],
), ),

View File

@ -99,7 +99,6 @@ class _ManageAccount extends HookWidget {
final displayNameController = final displayNameController =
useTextEditingController(text: user.person.displayName); useTextEditingController(text: user.person.displayName);
final bioController = useTextEditingController(text: user.person.bio);
final emailController = final emailController =
useTextEditingController(text: user.localUser.email); useTextEditingController(text: user.localUser.email);
final matrixUserController = final matrixUserController =
@ -122,13 +121,15 @@ class _ManageAccount extends HookWidget {
final deleteAccountPasswordController = useTextEditingController(); final deleteAccountPasswordController = useTextEditingController();
final bioFocusNode = useFocusNode();
final emailFocusNode = useFocusNode(); final emailFocusNode = useFocusNode();
final matrixUserFocusNode = useFocusNode(); final matrixUserFocusNode = useFocusNode();
final newPasswordFocusNode = useFocusNode(); final newPasswordFocusNode = useFocusNode();
// final verifyPasswordFocusNode = useFocusNode(); // final verifyPasswordFocusNode = useFocusNode();
// final oldPasswordFocusNode = useFocusNode(); // final oldPasswordFocusNode = useFocusNode();
final bioController = useEditorController(
instanceHost: user.instanceHost, text: user.person.bio);
final token = final token =
accountsStore.userDataFor(user.instanceHost, user.person.name)!.jwt; accountsStore.userDataFor(user.instanceHost, user.person.name)!.jwt;
@ -156,7 +157,9 @@ class _ManageAccount extends HookWidget {
displayName: displayNameController.text.isEmpty displayName: displayNameController.text.isEmpty
? null ? null
: displayNameController.text, : displayNameController.text,
bio: bioController.text.isEmpty ? null : bioController.text, bio: bioController.textEditingController.text.isEmpty
? null
: bioController.textEditingController.text,
email: emailController.text.isEmpty ? null : emailController.text, email: emailController.text.isEmpty ? null : emailController.text,
)); ));
@ -259,15 +262,13 @@ class _ManageAccount extends HookWidget {
style: theme.textTheme.headline6), style: theme.textTheme.headline6),
TextField( TextField(
controller: displayNameController, controller: displayNameController,
onSubmitted: (_) => bioFocusNode.requestFocus(), onSubmitted: (_) => bioController.focusNode.requestFocus(),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text(L10n.of(context).bio, style: theme.textTheme.headline6), Text(L10n.of(context).bio, style: theme.textTheme.headline6),
Editor( Editor(
controller: bioController, controller: bioController,
focusNode: bioFocusNode,
onSubmitted: (_) => emailFocusNode.requestFocus(), onSubmitted: (_) => emailFocusNode.requestFocus(),
instanceHost: user.instanceHost,
maxLines: 10, maxLines: 10,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -385,11 +386,7 @@ class _ManageAccount extends HookWidget {
], ],
), ),
BottomSticky( BottomSticky(
child: EditorToolbar( child: EditorToolbar(bioController),
editorFocusNode: bioFocusNode,
controller: bioController,
instanceHost: user.instanceHost,
),
) )
], ],
); );

View File

@ -6,10 +6,34 @@ import '../markdown_text.dart';
export 'editor_toolbar.dart'; export 'editor_toolbar.dart';
class EditorController {
final TextEditingController textEditingController;
final FocusNode focusNode;
final String instanceHost;
EditorController({
required this.textEditingController,
required this.focusNode,
required this.instanceHost,
});
}
EditorController useEditorController({
required String instanceHost,
String? text,
}) {
final focusNode = useFocusNode();
final textEditingController = useTextEditingController(text: text);
return EditorController(
textEditingController: textEditingController,
focusNode: focusNode,
instanceHost: instanceHost);
}
/// A text field with added functionality for ease of editing /// A text field with added functionality for ease of editing
class Editor extends HookWidget { class Editor extends HookWidget {
final TextEditingController? controller; final EditorController controller;
final FocusNode? focusNode;
final ValueChanged<String>? onSubmitted; final ValueChanged<String>? onSubmitted;
final ValueChanged<String>? onChanged; final ValueChanged<String>? onChanged;
final int? minLines; final int? minLines;
@ -20,12 +44,10 @@ class Editor extends HookWidget {
/// Whether the editor should be preview the contents /// Whether the editor should be preview the contents
final bool fancy; final bool fancy;
final String instanceHost;
const Editor({ const Editor({
super.key, super.key,
this.controller, required this.controller,
this.focusNode,
this.onSubmitted, this.onSubmitted,
this.onChanged, this.onChanged,
this.minLines = 5, this.minLines = 5,
@ -33,28 +55,24 @@ class Editor extends HookWidget {
this.labelText, this.labelText,
this.initialValue, this.initialValue,
this.fancy = false, this.fancy = false,
required this.instanceHost,
this.autofocus = false, this.autofocus = false,
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final defaultController = useTextEditingController(text: initialValue);
final actualController = controller ?? defaultController;
if (fancy) { if (fancy) {
return Padding( return Padding(
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: MarkdownText( child: MarkdownText(
actualController.text, controller.textEditingController.text,
instanceHost: instanceHost, instanceHost: controller.instanceHost,
), ),
); );
} }
return TextField( return TextField(
focusNode: focusNode, focusNode: controller.focusNode,
controller: actualController, controller: controller.textEditingController,
autofocus: autofocus, autofocus: autofocus,
keyboardType: TextInputType.multiline, keyboardType: TextInputType.multiline,
textCapitalization: TextCapitalization.sentences, textCapitalization: TextCapitalization.sentences,

View File

@ -13,6 +13,7 @@ import '../../util/files.dart';
import '../../util/mobx_provider.dart'; import '../../util/mobx_provider.dart';
import '../../util/observer_consumers.dart'; import '../../util/observer_consumers.dart';
import '../../util/text_lines_iterator.dart'; import '../../util/text_lines_iterator.dart';
import 'editor.dart';
import 'editor_picking_dialog.dart'; import 'editor_picking_dialog.dart';
import 'editor_toolbar_store.dart'; import 'editor_toolbar_store.dart';
@ -40,23 +41,18 @@ enum HeaderLevel {
} }
class EditorToolbar extends HookWidget { class EditorToolbar extends HookWidget {
final TextEditingController controller; final EditorController controller;
final String instanceHost;
final FocusNode editorFocusNode;
static const _height = 50.0; static const _height = 50.0;
const EditorToolbar({ const EditorToolbar(this.controller);
required this.controller,
required this.instanceHost,
required this.editorFocusNode,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final visible = useListenable(editorFocusNode).hasFocus; final visible = useListenable(controller.focusNode).hasFocus;
return MobxProvider( return MobxProvider(
create: (context) => EditorToolbarStore(instanceHost), create: (context) => EditorToolbarStore(controller.instanceHost),
child: Builder(builder: (context) { child: Builder(builder: (context) {
return AsyncStoreListener( return AsyncStoreListener(
asyncStore: context.read<EditorToolbarStore>().imageUploadState, asyncStore: context.read<EditorToolbarStore>().imageUploadState,
@ -81,8 +77,8 @@ class EditorToolbar extends HookWidget {
child: SingleChildScrollView( child: SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: _ToolbarBody( child: _ToolbarBody(
controller: controller, controller: controller.textEditingController,
instanceHost: instanceHost, instanceHost: controller.instanceHost,
), ),
), ),
), ),

View File

@ -31,12 +31,14 @@ class WriteComment extends HookWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final controller =
useTextEditingController(text: _isEdit ? comment?.content : null);
final showFancy = useState(false); final showFancy = useState(false);
final delayed = useDelayedLoading(); final delayed = useDelayedLoading();
final loggedInAction = useLoggedInAction(post.instanceHost); final loggedInAction = useLoggedInAction(post.instanceHost);
final editorFocusNode = useFocusNode();
final editorController = useEditorController(
instanceHost: post.instanceHost,
text: _isEdit ? comment?.content : null,
);
final preview = () { final preview = () {
final body = () { final body = () {
@ -70,12 +72,12 @@ class WriteComment extends HookWidget {
if (_isEdit) { if (_isEdit) {
return api.run(EditComment( return api.run(EditComment(
commentId: comment!.id, commentId: comment!.id,
content: controller.text, content: editorController.textEditingController.text,
auth: token.raw, auth: token.raw,
)); ));
} else { } else {
return api.run(CreateComment( return api.run(CreateComment(
content: controller.text, content: editorController.textEditingController.text,
postId: post.id, postId: post.id,
parentId: comment?.id, parentId: comment?.id,
auth: token.raw, auth: token.raw,
@ -114,11 +116,9 @@ class WriteComment extends HookWidget {
), ),
const Divider(), const Divider(),
Editor( Editor(
instanceHost: post.instanceHost, controller: editorController,
controller: controller,
autofocus: true, autofocus: true,
fancy: showFancy.value, fancy: showFancy.value,
focusNode: editorFocusNode,
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
@ -138,11 +138,7 @@ class WriteComment extends HookWidget {
], ],
), ),
BottomSticky( BottomSticky(
child: EditorToolbar( child: EditorToolbar(editorController),
editorFocusNode: editorFocusNode,
controller: controller,
instanceHost: post.instanceHost,
),
), ),
], ],
), ),