keep message drafts on room switches

this is for you courge
This commit is contained in:
Henry Hiles 2026-11-05 20:44:13 -05:00
commit e899bb3929
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -1,40 +1,50 @@
import "package:flutter/services.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:material_ui/material_ui.dart";
import "package:nexus/controllers/composer_draft.dart";
import "package:nexus/models/composer_params.dart";
import "package:nexus/models/relation_type.dart";
final class ChatComposer({
required final ValueNotifier<int?> relatedEvent,
required final ValueNotifier<RelationType> relationType,
required final int? relatedEvent,
required final RelationType relationType,
required final ComposerDraftController notifier,
required final FocusNode node,
}) {
factory use() {
final relatedEvent = useState<int?>(null);
final relationType = useState(RelationType.reply);
factory use(WidgetRef ref, ComposerParams composer) {
final provider = ComposerDraftController.provider(composer);
final node = useFocusNode(
onKeyEvent: (_, event) {
onKeyEvent: (node, event) {
if (event is KeyDownEvent && event.logicalKey == .escape) {
relatedEvent.value = null;
ref.read(provider.notifier).dismiss();
// Ending an edit replaces the text field, losing its focus
WidgetsBinding.instance.addPostFrameCallback(
(_) => node.requestFocus(),
);
return .handled;
}
return .ignored;
},
);
final (relatedEvent, relationType) = ref.watch(
provider.select((draft) => (draft.relatedEvent, draft.relationType)),
);
return .new(
relatedEvent: relatedEvent,
relationType: relationType,
notifier: ref.watch(provider.notifier),
node: node,
);
}
int? get repliedEventRowId =>
relationType.value == .reply ? relatedEvent.value : null;
int? get repliedEventRowId => relationType == .reply ? relatedEvent : null;
void relate(int rowId, RelationType type) {
relatedEvent.value = rowId;
relationType.value = type;
node.requestFocus();
notifier.relate(rowId, type);
// Starting an edit replaces the text field, losing its focus
WidgetsBinding.instance.addPostFrameCallback((_) => node.requestFocus());
}
}