move part of the functionality to EditorController for clutter reduction
This commit is contained in:
parent
c15cfdf02c
commit
2d7d2a64bd
|
@ -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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -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,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in New Issue